개요
요청이 앱에 전송되면 App Engine에 의해 요청 로그가 자동으로 작성됩니다. 요청을 처리하는 동안 앱은 애플리케이션 로그를 작성할 수도 있습니다. 이 페이지에서는 애플리케이션에서 애플리케이션 로그를 작성하는 방법, Google Cloud 콘솔에서 로깅을 확인하는 방법, 요청 중 App Engine이 작성하는 요청 로그 데이터를 이해하는 방법을 설명합니다.
로그데이터 다운로드에 대한 자세한 내용은 로그 내보내기 개요를 참조하세요.
요청 로그와 애플리케이션 로그
로그 데이터에는 요청 로그와 애플리케이션 로그의 두 가지 카테고리가 있습니다. 요청 로그는 앱에서 처리되는 요청마다 App Engine에서 자동으로 작성하며, 프로젝트 ID, HTTP 버전 등의 정보를 포함합니다. 요청 로그에 사용 가능한 속성의 전체 목록은 RequestLogs를 참조하세요. 또한 요청 로그 필드에 대한 설명은 요청 로그 표를 참조하세요.
각 요청 로그는 요청과 연관된 애플리케이션 로그(AppLogLine) 목록을 포함하며 RequestLogs.getAppLogLines()
메서드에서 반환됩니다. 각 앱 로그에는 로그가 작성된 시간, 로그 메시지, 로그 수준이 포함됩니다.
애플리케이션 로그 작성
개발자는 App Engine 자바 SDK를 통해 다음과 같은 심각도 수준을 기록할 수 있습니다.- SEVERE
- 경고
- 정보
- CONFIG
- FINE
- FINER
- FINEST
INFO
, WARNING
, SEVERE
로그 수준은 추가 구성이 없는 로그에 나타납니다. 자바 앱에 다른 수준의 로깅을 추가하려면 프로젝트의 appengine-web.xml
파일에 적절한 시스템 속성을 추가해야 합니다. 원하는 로그 수준을 설정하려면 logging.properties
파일을 수정해야 할 수도 있습니다. 이러한 파일 모두 Maven을 사용하여 새 App Engine 자바 프로젝트를 만들 때 생성됩니다. 이러한 파일은 다음 위치에서 찾을 수 있습니다.
INFO
, WARNING
또는 SEVERE
이외의 로그 수준을 추가하려면 appengine-web.xml
파일을 수정하여 <appengine-web-app>
태그 내에 다음을 추가합니다.
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
logging.properties
의 기본 로그 수준은 INFO
입니다. 앱의 모든 클래스에 대한 기본 로그 수준을 변경하려면 logging.properties
파일을 수정하여 수준을 변경합니다. 예를 들어 .level = INFO
를 .level = WARNING
으로 변경할 수 있습니다.
애플리케이션 코드는 java.util.logging.Logger API를 사용하여 로그 메시지를 작성합니다. 아래 예시에서는 정보 로그 메시지를 작성합니다.
import java.util.logging.Logger; //... public class MyClass { private static final Logger log = Logger.getLogger(MyClass.class.getName()); log.info("Your information log message."); //....
앱이 실행될 때 App Engine은 메시지를 기록하고 로그 탐색기에 제공합니다.
Google Cloud Console의 로그 URL 형식
Google Cloud 콘솔의 로그 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로 로그를 내보내면 됩니다.