태스크 로그 작성

이 문서에서는 태스크 로그를 작성하는 방법과 태스크 로그가 있는 Batch 작업을 만들고 실행하는 방법을 설명합니다.

작업에 로깅이 사용 설정되면 런타임 중에 작업의 실행 가능 항목이 출력하는 메시지에서 작업 로그가 생성됩니다. 태스크 로그를 작성하도록 실행 가능 항목을 구성하면 Cloud Logging에 맞춤 정보를 표시할 수 있으므로 작업을 더 쉽게 분석하고 문제를 해결할 수 있습니다. 로그에 대한 자세한 내용은 로그를 이용한 작업 분석을 참고하세요.

시작하기 전에

  1. Batch를 사용한 적이 없으면 Batch 시작하기를 검토하고 프로젝트 및 사용자 기본 요건을 완료하여 Batch를 사용 설정하세요.
  2. 로그를 작성하는 작업을 만드는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.

    역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

    커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

태스크 로그가 포함된 작업 만들기 및 실행

작업 로그가 포함된 작업을 만들고 실행하려면 작업을 만들 때 다음을 실행합니다.

  1. 작업의 로그를 사용 설정합니다. 이렇게 하면 작업에 작성된 모든 로그가 생성됩니다.
  2. 작업에 포함할 각 태스크 로그에 대해 태스크 로그를 실행 파일에 쓰는 명령어를 추가합니다. 작업이 실행되면 태스크 로그를 작성하는 명령어가 실행될 때마다 태스크 로그가 생성됩니다.

    태스크 로그를 작성하는 방법을 알아보려면 이 문서의 태스크 로그 작성을 참고하세요.

태스크 로그 작성

태스크 로그는 작업의 실행 가능 항목이 런타임 중에 표준 출력(stdout) 스트림 또는 표준 오류(stderr) 스트림에 출력하는 모든 콘텐츠에 대해 기록됩니다. 예를 들어 echo 명령어를 사용하여 작업 로그를 작성할 수 있습니다. 결과 작업 로그의 구조는 인쇄된 콘텐츠의 형식에 따라 다릅니다. 특히 다음 옵션 중 하나를 사용하여 각 태스크 로그를 작성할 수 있습니다.

문자열을 출력하여 구조화되지 않은 로그 작성

구조화되지 않은 로그를 사용하면 로그의 textPayload 필드에 표시되는 문자열인 메시지를 정의할 수 있습니다.

구조화되지 않은 로그를 작성하려면 다음 섹션에 설명된 대로 형식이 지정되지 않은 문자열을 출력합니다.

비구조화 로그 예시

예를 들어 다음 문자열이 포함된 작업 로그를 원한다고 가정해 보겠습니다.

MESSAGE

이 문자열 예시를 출력하면 다음과 유사한 태스크 로그가 생성됩니다.

insertId: ...
labels: ...
logName: projects/PROJECT_ID/logs/batch_task_logs
receiveTimestamp: ...
resource: ...
severity: INFO
textPayload: MESSAGE
timestamp: ...

다음을 바꿉니다.

  • MESSAGE: 태스크 로그의 목적을 요약하는 문자열인 메시지(예: The summary for a task log.)
  • PROJECT_ID: 프로젝트의 프로젝트 ID

실행 파일에 다음 echo 명령어를 포함하는 등 다양한 방법으로 문자열을 출력할 수 있습니다.

echo MESSAGE

echo 명령어를 사용하여 구조화되지 않은 작업 로그를 작성하는 작업의 포괄적인 예는 기본 작업 만들기 및 실행을 참고하세요.

JSON 객체를 출력하여 구조화된 로그 작성

구조화된 로그를 사용하면 다음을 정의할 수 있습니다.

구조화된 로그를 작성하려면 JSON 객체를 출력합니다. 다음 섹션에서는 일부 표준 필드와 맞춤 필드를 사용하여 로그를 정의하는 방법을 보여줍니다. 맞춤 상태 이벤트로 로그를 정의하는 방법을 알아보려면 맞춤 상태 이벤트 구성도 참고하세요.

구조화된 로그 예시

예를 들어 메시지, 심각도, 2개의 커스텀 필드를 정의하는 다음 JSON 객체에 있는 정보가 포함된 태스크 로그가 필요하다고 가정해 보겠습니다.

{
  "message": "MESSAGE"
  "severity": "SEVERITY"
  "CUSTOM_FIELD_1": CUSTOM_VALUE_1
  "CUSTOM_FIELD_2": CUSTOM_VALUE_2
}

이 JSON 객체를 출력하면 다음과 유사한 작업 로그가 생성됩니다.

insertId: ...
jsonPayload:
  "CUSTOM_FIELD_1": CUSTOM_VALUE_1
  "CUSTOM_FIELD_2": CUSTOM_VALUE_2
  message: MESSAGE
labels: ...
logName: projects/PROJECT_ID/logs/batch_task_logs
receiveTimestamp: ...
resource: ...
severity: SEVERITY
timestamp: ...

다음을 바꿉니다.

  • MESSAGE: 태스크 로그의 목적을 요약하는 문자열인 메시지(예: The summary for a task log.)
  • SEVERITY: 로그의 심각도. 작업의 로그를 볼 때 필터로 사용할 수 있습니다. 심각도는 첫 글자만 대문자인 문자열로 변환되는 LogSeverity enum 중 하나여야 합니다. 예를 들어 ERROR enum의 경우 Error를 지정합니다.
  • CUSTOM_FIELD_1CUSTOM_FIELD_2: 태스크 로그의 커스텀 필드 이름입니다(예: custom_field_1custom_field_2).
  • CUSTOM_VALUE_1CUSTOM_VALUE_2: 태스크 로그의 커스텀 필드 값으로, 다양한 데이터 유형일 수 있으며 따옴표가 필요할 수 있습니다(예: "the first custom field"2).
  • PROJECT_ID: 프로젝트의 프로젝트 ID

다양한 메서드를 사용하여 이 JSON 객체 예시를 출력할 수 있습니다. 예를 들어 다음 샘플은 JSON 객체 예시를 출력하는 데 사용할 수 있는 몇 가지 메서드를 보여줍니다.

  • echo 명령어를 사용하여 이에 상응하는 문자열을 출력합니다.
  • Python을 사용하여 이에 상응하는 사전을 출력합니다.

echo 명령어

echo 명령어와 이에 상응하는 문자열을 사용하여 예시 JSON 객체를 출력하려면 실행 가능 항목에 다음 명령어를 포함합니다.

echo '{\"message\":\"MESSAGE\", \"severity\":\"SEVERITY\", \"CUSTOM_FIELD_1\":CUSTOM_VALUE_1, \"CUSTOM_FIELD_2\":CUSTOM_VALUE_2}'

예를 들어 다음과 같은 실행 파일을 사용하여 작업을 만들고 실행한다고 가정해 보겠습니다.

"script": {
  "text": "echo '{\"message\":\"The message for a structured log.\", \"severity\":\"Error\", \"custom_field_1\":\"the first custom field\", \"custom_field_2\":2}'"
}

그러면 결과 작업 로그는 다음과 유사합니다.

insertId: ...
jsonPayload:
  custom_field_1: the first custom field
  custom_field_2: 2
  message: The summary for a structured task log with error severity.
labels: ...
logName: projects/PROJECT_ID/logs/batch_task_logs
receiveTimestamp: ...
resource: ...
severity: ERROR
timestamp: ...

Python

Python과 이에 상응하는 사전을 사용하여 예시 JSON 객체를 출력하려면 실행 가능 항목에 다음 샘플을 포함합니다.

#!/usr/bin/env python3

import json

entry = dict(
    severity="SEVERITY",
    message="MESSAGE",
    CUSTOM_FIELD_1=CUSTOM_VALUE_1,
    CUSTOM_FIELD_2=CUSTOM_VALUE_2,
)
print(json.dumps(entry))

예를 들어 다음과 같은 실행 파일을 사용하여 작업을 만들고 실행한다고 가정해 보겠습니다.

"script": {
  "text": "#!/usr/bin/env python3\n\nimport json\n\nentry = dict(\nseverity=\"Error\",\nmessage=\"The summary for a structured task log with error severity.\",\ncustom_field_1=\"the first custom field\",\ncustom_field_2=2,\n)\nprint(json.dumps(entry))"
}

그러면 결과 작업 로그는 다음과 유사합니다.

insertId: ...
jsonPayload:
  custom_field_1: the first custom field
  custom_field_2: 2
  message: The summary for a structured task log with error severity.
labels: ...
logName: projects/PROJECT_ID/logs/batch_task_logs
receiveTimestamp: ...
resource: ...
severity: ERROR
timestamp: ...

다음 단계