애플리케이션 로그 읽기 및 쓰기

개요

요청이 앱에 전송되면 App Engine에 의해 요청 로그가 자동으로 작성됩니다. 요청을 처리하는 동안 앱은 애플리케이션 로그를 작성할 수도 있습니다. 이 페이지에서는 애플리케이션에서 애플리케이션 로그를 작성하는 방법, Google Cloud Console에서 로깅을 확인하는 방법, 요청 중 App Engine이 작성하는 요청 로그 데이터를 이해하는 방법을 설명합니다.

로그데이터 다운로드에 대한 자세한 내용은 로그 내보내기 개요를 참조하세요.

요청 로그와 애플리케이션 로그

로그 데이터에는 요청 로그와 애플리케이션 로그의 두 가지 카테고리가 있습니다. 요청 로그는 앱에서 처리되는 요청마다 App Engine에서 자동으로 작성하며, 프로젝트 ID, HTTP 버전 등의 정보를 포함합니다.

애플리케이션 로그 작성

기본 제공 PHP 함수 syslog()를 호출할 때 Logs PHP API를 사용하여 로그를 작성합니다. 예를 들면 다음과 같습니다.

if (authorizedUser()) {
  echo '<p>Welcome authorized user</p>';
  syslog(LOG_INFO, 'Authorized access');
} else {
  echo 'Go away unauthorized user<p />';
  syslog(LOG_WARNING, "Unauthorized access");
}

syslog에 쓰기 전에 openlog() 또는 closelog()를 호출할 필요는 없습니다. 이러한 함수에 대한 호출은 무시됩니다.

Google Cloud Console의 로그 URL 형식

Google Cloud Console의 로그 URL 형식 예시는 다음 샘플 URL을 참조하세요.

https://console.cloud.google.com/logs?filters=request_id:000000db00ff00ff827e493472570001737e73686966746361727331000168656164000100

콘솔에서 로그 읽기

표준 환경에서 실행되는 앱에서 작성된 로그를 보려면 로그 탐색기를 사용하세요.

일반적인 App Engine 로그에는 다음 샘플 로그에서 볼 수 있듯이 Apache 결합 로그 형식의 데이터와 일부 특수한 App Engine 필드가 포함됩니다.

192.0.2.0 - test [27/Jun/2014:09:11:47 -0700] "GET / HTTP/1.1" 200 414
"http://www.example.com/index.html"
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"
"1-dot-calm-sylph-602.appspot.com" ms=195 cpu_ms=42 cpm_usd=0.000046
loading_request=1 instance=00c61b117cfeb66f973d7df1b7f4ae1f064d app_engine_release=

요청 로그 필드 이해

다음 표에는 표시 순서에 따라 필드와 설명이 나와 있습니다.

필드 순서 필드 이름 항상 표시 여부 설명
1 클라이언트 주소 클라이언트 IP 주소입니다. 예: 192.0.2.0
2 RFC 1413 ID 아니요 클라이언트의 RFC 1413 ID입니다. 거의 항상 문자 -입니다.
3 사용자 아니요 앱에서 Users API를 사용하고 사용자가 로그인한 경우에만 있습니다. 이 값은 Google 계정의 '닉네임' 부분입니다. 예를 들어 Google 계정이 test@example.com이면 이 필드에 로깅되는 닉네임은 test입니다.
4 타임스탬프 요청 타임스탬프입니다. 예: [27/Jun/2014:09:11:47 -0700]
5 요청 쿼리 문자열 요청의 첫 번째 줄로, 메서드, 경로, HTTP 버전을 포함합니다. 예: GET / HTTP/1.1
6 HTTP 상태 코드 반환된 HTTP 상태 코드입니다. 예: 200
7 응답 크기 응답 크기(바이트)입니다. 예: 414
8 참조자 경로 아니요 참조자가 없는 경우 로그에는 경로 없이 -만 포함됩니다. 참조자 경로의 예시: "http://www.example.com/index.html"
9 사용자 에이전트 웹 서버에 브라우저와 운영체제를 확인합니다. 예: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
10 호스트 이름 클라이언트에서 App Engine 애플리케이션에 연결하는 데 사용하는 호스트 이름입니다. 예: (1-dot-calm-sylph-602.appspot.com)
11 벽시계 시간 App Engine이 요청에 소비한 총 시간(밀리초 단위)입니다. 애플리케이션 인스턴스를 실행 중인 서버와 클라이언트 사이에서 소비된 시간은 포함되지 않습니다. 예: ms=195
12 CPU 밀리초 요청을 수행하는 데 필요한 CPU 밀리초입니다. CPU에서 애플리케이션 코드를 실제로 실행하는 데 소비한 밀리초 단위의 시간이며, 1.2GHz Intel x86 CPU를 기준으로 표현됩니다. 실제 사용된 CPU가 이 기준보다 더 빠른 경우 CPU 밀리초는 위에 정의된 실제 시계 시간보다 더 클 수 있습니다. 예: cpu_ms=42
13 종료 코드 아니요 인스턴스가 요청을 받은 후 종료되는 경우에만 존재합니다. 형식은 exit_code=XXX이며, 여기서 XXX는 인스턴스 종류 이유에 해당하는 3자리 숫자입니다. 종료 코드는 주로 Google에서 문제를 찾아 수정하기 위한 용도로 사용되므로 문서화되지 않았습니다.
14 추정 비용 지원이 중단되었습니다. 요청 1,000개당 추정 비용(USD)입니다. 예: cpm_usd=0.000046
15 큐 이름 아니요 사용되는 태스크 큐 이름입니다. 요청이 태스크 큐를 사용한 경우에만 존재합니다. 예: queue_name=default
16 태스크 이름 아니요 이 요청을 위해 태스크 큐에서 실행된 태스크의 이름입니다. 요청으로 인해 태스크가 큐에 추가된 경우에만 존재합니다. 예: task_name=7287390692361099748
17 보류 중인 큐 아니요 요청이 보류 중인 큐에서 어느 정도의 시간을 소비한 경우에만 존재합니다. 로그에 이러한 항목이 많거나 값이 높은 경우 트래픽을 감당하기 위해 더 많은 인스턴스가 필요하다는 의미일 수 있습니다. 예: pending_ms=195
18 로딩 요청 아니요 요청이 로딩 요청인 경우에만 존재합니다. 인스턴스를 시작해야 했음을 의미합니다. 이상적으로 인스턴스는 재활용되어 다시 시작되기 전까지 최대한 오래 가동되며 정상 상태를 유지하면서 많은 수의 요청을 처리해야 합니다. 즉, 로그에 이 항목이 많지 않아야 합니다. 예: loading_request=1
19 인스턴스 요청을 처리하는 인스턴스의 고유 식별자입니다. 예: instance=00c61b117cfeb66f973d7df1b7f4ae1f064d
20 버전 프로덕션 App Engine에 사용되는 현재 App Engine 출시 버전입니다(예: ).

할당량 및 한도

애플리케이션은 다음 로그 관련 할당량의 영향을 받습니다.

  • Logs API를 통해 검색되는 로그 데이터
  • 로그 수집 할당량 및 보관

검색된 데이터 할당량

Logs API 호출을 통해 하루에 검색되는 로그 데이터 중 처음 100MB는 무료입니다. 100MB를 초과하는 데이터에는 $0.12/GB의 비용이 청구됩니다.

로그 수집 할당량

App Engine 앱의 로깅은 Google Cloud Observability에서 제공됩니다. 로깅 비용 및 한도에 대한 자세한 내용은 Google Cloud Observability 가격 책정을 참조하세요. 로그를 장기간 저장하려면 Google Cloud Observability에서 Cloud Storage, BigQuery, Pub/Sub로 로그를 내보내면 됩니다.