디버그 로그 지점

애플리케이션을 배포하거나 시작한 후 Google Cloud Console에서 Cloud Debugger를 열 수 있습니다. Cloud Debugger를 사용하면 일반적인 서비스 기능을 다시 시작하거나 방해하지 않고 실행 중인 서비스에 로깅을 삽입할 수 있습니다. 이 기능은 로그 구문을 추가하거나 다시 배포하지 않고 프로덕션 문제를 디버깅하는 데 유용합니다.

Google Cloud Debugger를 사용하려면 Cloud Console의 디버그 페이지를 방문하세요.

시작하기 전에

Cloud Debugger는 애플리케이션의 소스 코드에 대한 액세스 권한 유무와 관계없이 사용할 수 있습니다. 소스 코드를 사용할 수 없는 경우 파일 이름과 줄 번호를 수동으로 입력하는 방법은 아래의 디버그 로그 지점 추가를 참조하세요.

Google Cloud Repository에 저장되어 있는 소스 코드는 디버그 뷰에 자동으로 표시됩니다.

로컬 또는 Git 저장소 등 다른 곳에 저장된 소스 코드에 액세스하려면 소스 코드 위치를 선택해야 할 수 있습니다.

로그 지점

로그 지점을 사용하면 일반적인 서비스 기능을 다시 시작하거나 방해하지 않고 실행 중인 서비스에 로깅을 삽입할 수 있습니다. 인스턴스가 로그 지점 위치에서 코드를 실행할 때마다 Cloud Debugger가 메시지를 로깅합니다. 출력은 대상 환경의 해당 로그에 전송됩니다. 예를 들어 App Engine에서는 출력이 Cloud Logging의 요청 로그에 전송됩니다.

로그 지점은 생성 후 24시간 동안 또는 삭제되거나 서비스가 다시 배포될 때까지 활성 상태로 유지됩니다.

카나리아가 포함된 Debugger 에이전트

로그 지점을 설정하면 Debugger 에이전트가 인스턴스의 하위 집합에서 로그 지점을 테스트합니다. Debugger 에이전트가 로그 지점이 성공적으로 실행될 수 있는지 확인하면 로그 지점이 모든 인스턴스에 적용됩니다. 이 과정은 약 40초 정도 걸립니다.

이 프로세스 이후 로그 지점이 트리거되면 Debugger 에이전트가 메시지를 로깅합니다. 로그 지점을 설정한 후 40초 이내에 트리거되면 Debugger 에이전트는 카나리아 로그 지점이 적용된 인스턴스의 메시지를 로깅합니다.

Debugger 에이전트는 데이터를 캡처할 때 발생하는 지연 시간을 최소화하기 위한 몇 가지 전략을 구현합니다.

Debugger 에이전트가 카나리아를 실행하는 동안 다음이 표시됩니다.

Debugger 에이전트가 인스턴스 카나리아

카나리아 모드에서 Debugger 에이전트가 실패하는 경우 수행할 작업을 알아 보려면 디버그 스냅샷 페이지의 문제 해결 섹션으로 이동하세요.

어떤 Debugger 에이전트 버전에 카나리아 기능이 있는지 알아보려면 언어별 페이지를 참조하세요.

카나리아가 없는 Debugger 에이전트

카나리아 없이 Debugger 에이전트를 사용하고 로그 지점을 설정하면 실행 중인 모든 앱 인스턴스에 적용됩니다. 모든 인스턴스가 로그 지점 위치에서 처음으로 코드를 실행하면 디버거 에이전트가 메시지를 로깅합니다. Debugger 에이전트는 데이터를 캡처할 때 발생하는 지연 시간을 최소화하기 위한 몇 가지 전략을 구현합니다.

디버그 로그 지점 추가

Console

Cloud Console에서 로그 지점을 추가하는 방법은 다음과 같습니다.

  1. 오른쪽 패널에서 로그 지점 탭이 선택되어 있는지 확인합니다.
  2. 왼쪽 패널에서 로그 지점을 추가할 소스 코드가 포함된 파일을 선택합니다. 파일 콘텐츠가 가운데 패널에 표시됩니다.
  3. 로그 지점을 추가할 위치에서 줄 번호를 클릭합니다.
  4. logpoint("") 필드 사이에 메시지를 입력하고 추가 버튼을 클릭합니다. {newScore.score}와 같은 중괄호 사이에 표현식을 입력하여 값을 로깅할 수 있습니다.

로그 지점 인라인 추가


사용할 수 있는 소스 코드가 없는 경우 로그 지점 패널에 파일 이름:줄 및 기타 세부정보를 수동으로 입력할 수 있습니다. 로그 지점 수동으로 추가

gcloud

명령줄에서 로그 지점을 추가하려면 다음 명령어를 입력합니다.

gcloud debug logpoints create LOCATION MESSAGE

각 항목의 의미는 다음과 같습니다.

  • LOCATION은 로그 지점을 설정할 파일 이름과 줄입니다. 형식은 FILE:LINE입니다. 여기서 FILE은 파일 이름 또는 이름이 같은 다른 파일이 있을 경우, 구분하기 위한 경로 구성요소가 앞에 있는 파일 이름입니다. 디버그 대상에 고유하지 않은 파일 이름이 지정되면 오류가 발생합니다.
  • MESSAGE는 로깅할 메시지입니다.

다음 예시에서는 info 로그 수준(로그 지점의 기본 로그 수준)에서 score 값을 로깅합니다.

gcloud debug logpoints create HighScoreService.java:105 \
  "User {name} scored {newScore.score}"

HighScoreService.java executes105번째 줄이 실행되면 출력 문자열에 삽입된 namenewScore.score 변수 값과 함께 메시지가 로깅됩니다.

로그 지점 메시지 형식

로그 지점 메시지로 출력에 로깅되는 항목을 결정합니다. 표현식을 사용하면 원하는 값을 평가하고 로깅할 수 있습니다. {myObj.myFunc()} 또는 {a + b}와 같은 중괄호 사이에 있는 메시지 내용은 출력에 있는 해당 표현식의 값으로 대체됩니다. 위의 예시에 있는 User {name} scored {newScore.score} 메시지는 User user1 scored 99와 비슷한 출력을 로깅합니다.

표현식에 다음 언어 기능을 사용할 수 있습니다.

자바

다음을 포함한 대부분의 자바 표현식이 지원됩니다.
  • 로컬 변수: a == 8
  • 숫자 및 부울 연산: x + y < 20
  • 인스턴스 및 정적 필드: this.counter == 20, this.myObj.isShutdown, myStatic 또는 com.mycompany.MyClass.staticMember
  • 등호 연산자가 포함된 문자열 비교: myString == "abc"
  • 함수 호출. 읽기 전용 함수만 사용할 수 있습니다. 예를 들어 StringBuilder.indexOf()는 지원되지만 StringBuilder.append()는 지원되지 않습니다.
  • 정규화된 유형으로 유형 변환: ((com.myprod.ClassImpl) myInterface).internalField

다음 언어 기능은 지원되지 않습니다.

  • Integer와 같은 unboxing 숫자 유형. 대신 myInteger.value를 사용하세요.

Python

다음을 포함한 대부분의 Python 표현식이 지원됩니다.
  • 로컬 및 전역 변수 읽기
  • 배열, 목록, 슬라이스, 사전, 객체에서 읽기
  • 단순 메소드 호출

다음 언어 기능은 지원되지 않습니다.

  • 새 객체를 할당하거나 복잡한 구조를 사용하는 함수 호출
  • 표현식 내부에 새 객체 만들기

Go

다음을 포함한 대부분의 Go 표현식 구문이 지원됩니다.
  • 로컬 및 전역 변수 읽기
  • 배열, 슬라이스, 맵, 구조체에서 읽기

다음 언어 기능은 지원되지 않습니다.

  • 인터페이스 값에서 읽기
  • 유형 변환 및 복합 리터럴
  • len 이외의 함수 호출

로그 지점 조건

로그 지점 조건은 애플리케이션 언어로 된 간단한 표현식이며 로그 지점이 로깅되려면 이 조건은 true로 평가되어야 합니다. 로그 지점 조건은 로그 지점이 만료되거나 삭제될 때까지 모든 인스턴스에서 줄이 실행될 때마다 평가됩니다.

조건은 논리 연산자를 포함할 수 있는 완전한 부울 표현식입니다.

travelAccessory == “Towel”
ultimateAnswer <= 42
travelAccessory == “Towel” && ultimateAnswer <= 42

표현식에 지원되는 동일한 언어 기능을 조건에도 사용할 수 있습니다.

Console

'if' 문 내부에 조건을 입력합니다.

조건 인라인 설정

사용할 수 있는 소스 코드가 없는 경우 로그 지점 패널에서 조건을 지정할 수 있습니다.

gcloud

logpoints create--condition 플래그를 사용하여 조건을 다음과 같이 표현합니다.

gcloud debug logpoints create HighScoreService.java:105 
--condition="newScore.score > 40"
--log-level="warning"
"Suspiciously high score ({newScore.score}) from user {name}"

위의 예시에서 로그 지점은 애플리케이션의 105번째 줄이 실행될 때 newScore.score 값을 확인합니다. 이 값이 40보다 크면 경고 메시지가 로그에 추가됩니다.

출력 보기

로그 지점 출력은 대상 환경의 해당 로그에 전송됩니다.

App Engine

App Engine 앱에 설정된 로그 지점은 Cloud Logging의 요청 로그에 출력을 전송합니다.

로그 패널 또는 전용 로그 탐색기에서 로그를 볼 수 있습니다.

로그 패널의 로그 지점

Compute Engine

Compute Engine 앱에 설정된 로그 지점은 일반적인 로그 구문과 같은 위치에 출력을 전송합니다. 예를 들어 Python에서 기본 로깅 모듈은 stdout에 출력을 전송하지만 특정 파일에 쓰도록 구성할 수 있습니다.

이러한 로그를 Cloud Logging에 전달하도록 Logging 에이전트를 설정할 수 있습니다. Stackdriver Logging의 로그 탐색기에서 로그를 볼 수 있습니다.

로그 지점 삭제

로그 지점은 24시간 후에 비활성화되고 메시지 로깅이 중지되며 30일 후에는 자동으로 삭제됩니다. 로그 지점을 수동으로 삭제할 수 있는데 그러면 로깅이 중지되고 나중에 참조할 수 있는 기록에서 삭제됩니다. 하지만 로그 지점을 삭제해도 이미 생성된 로그 메시지는 삭제되지 않습니다.

Console

수동으로 로그 지점을 삭제하려면 로그 지점 기록 패널에서 더보기 메뉴를 사용합니다.

로그 지점 삭제

gcloud

로그 지점을 수동으로 삭제하려면 로그 지점의 ID 또는 코드 위치의 정규 표현식을 사용하여 로그 지점을 지정하면 됩니다.

gcloud debug logpoints delete HighScoreService.java:105

Debug target not specified. Using default target: default-1
This command will delete the following logpoints:

LOCATION                   CONDITION            LOG_LEVEL  LOG_MESSAGE_FORMAT                                             ID
HighScoreService.java:105                       INFO       User {name} scored {newScore.score}.                           53aaa3bd8d2d7-b76f-feb5d
HighScoreService.java:105  newScore.score > 40  WARNING    Suspiciously high score ({newScore.score}) from user {name}  53aaa3bsdffd7-b56f-fasfg

Do you want to continue (Y/n)?  Y
Deleted 2 logpoints.