로그를 사용하여 작업 분석

이 문서에서는 Batch 작업에 대해 Cloud Logging에서 로그를 사용 설정하고, 생성하고, 보는 방법을 설명합니다.

로그를 사용하여 작업 분석에 유용한 정보를 가져올 수 있습니다. 예를 들어 로그는 실패한 작업을 디버깅할 수 있습니다.

특히 로그는 작업 실행이 시작된 그리고 작업에 로깅이 사용 설정된 경우에만 생성됩니다. 로그 없이 작업을 분석해야 하는 경우 대신 상태 이벤트를 확인합니다.

시작하기 전에

작업 로깅 사용 설정

작업에 대한 로그 생성을 허용하려면 작업을 만들 때 Cloud Logging의 로그를 사용 설정합니다.

  • Google Cloud 콘솔을 사용하여 작업을 만들면 Cloud Logging의 로그가 항상 사용 설정됩니다.
  • gcloud CLI 또는 Batch API를 사용하여 작업을 만들면 Cloud Logging의 로그가 기본적으로 중지됩니다. Cloud Logging에서 로그를 사용 설정하려면 작업을 만드는 동안 logsPolicy 필드에 다음 구성을 포함합니다.

    {
        ...
        "logsPolicy": {
            "destination": "CLOUD_LOGGING"
        }
        ...
    }
    

작업 로그 작성 및 생성

작업에 대해 Cloud Logging의 로그가 사용 설정되면 Cloud Logging은 작업에 대해 기록된 모든 로그를 자동으로 생성합니다. 특히 Batch 작업은 다음 로그 유형을 포함할 수 있습니다.

  • 에이전트 로그(batch_agent_logs): Batch 서비스 에이전트의 활동에 대한 로그입니다.

    Batch는 로깅을 사용 설정한 모든 작업의 에이전트 로그를 자동으로 작성합니다.

  • 태스크 로그(batch_task_logs): 표준 출력(stdout) 스트림 또는 표준 오류(stderr) 스트림에 기록하도록 작업의 실행 가능 항목을 구성한 모든 데이터의 로그입니다.

    원하는 경우 로깅을 사용 설정한 각 작업에 대해 태스크 로그를 작성할 수 있습니다.

작업 로그 보기

Google Cloud 콘솔, gcloud CLI, Logging API, Go, Java, Python 또는 C++을 사용하여 작업 로그를 볼 수 있습니다.

콘솔

Google Cloud 콘솔을 사용하여 작업 로그를 보려면 다음을 수행합니다.

  1. Google Cloud 콘솔에서 작업 목록 페이지로 이동합니다.

    작업 목록으로 이동

  2. 작업 이름 열에서 작업 이름을 클릭합니다. 작업 세부정보 페이지가 열립니다.

  3. 로그 탭을 클릭합니다. Batch는 작업과 관련된 모든 로그를 표시합니다.

  4. 선택사항: 로그를 필터링하려면 다음 중 하나를 수행합니다.

gcloud

gcloud CLI를 사용하여 로그를 보려면 gcloud logging read 명령어를 사용합니다.

gcloud logging read "QUERY"

여기서 QUERYBatch 필터 매개변수가 포함된 Batch 로그에 대한 쿼리입니다.

API

Logging API를 사용하여 로그를 보려면 entries.list 메서드를 사용합니다.

POST https://logging.googleapis.com/v2/entries:list
{
    "resourceNames": [
        "projects/PROJECT_ID"
    ],
    "filter": "QUERY"
    "orderBy": "timestamp desc"
}

다음을 바꿉니다.

Go

Go

자세한 내용은 Batch Go API 참조 문서를 확인하세요.

Batch에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

import (
	"context"
	"fmt"
	"io"

	batch "cloud.google.com/go/batch/apiv1"
	"cloud.google.com/go/logging"
	"cloud.google.com/go/logging/logadmin"
	"google.golang.org/api/iterator"
	batchpb "google.golang.org/genproto/googleapis/cloud/batch/v1"
)

// Retrieve the logs written by the given job to Cloud Logging
func printJobLogs(w io.Writer, projectID string, job *batchpb.Job) error {
	// projectID := "your_project_id"

	ctx := context.Background()
	batchClient, err := batch.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("NewClient: %w", err)
	}
	defer batchClient.Close()

	adminClient, err := logadmin.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("Failed to create logadmin client: %w", err)
	}
	defer adminClient.Close()

	const name = "batch_task_logs"

	iter := adminClient.Entries(ctx,
		// Only get entries from the "batch_task_logs" log for the job with the given UID
		logadmin.Filter(fmt.Sprintf(`logName = "projects/%s/logs/%s" AND labels.job_uid=%s`, projectID, name, job.Uid)),
	)

	var entries []*logging.Entry

	for {
		logEntry, err := iter.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return fmt.Errorf("unable to fetch log entry: %w", err)
		}
		entries = append(entries, logEntry)
		fmt.Fprintf(w, "%s\n", logEntry.Payload)
	}

	fmt.Fprintf(w, "Successfully fetched %d log entries\n", len(entries))

	return nil
}

Java

Java

자세한 내용은 Batch Java API 참조 문서를 확인하세요.

Batch에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

import com.google.cloud.batch.v1.Job;
import com.google.cloud.logging.v2.LoggingClient;
import com.google.logging.v2.ListLogEntriesRequest;
import com.google.logging.v2.LogEntry;
import java.io.IOException;

public class ReadJobLogs {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Cloud project hosting the job.
    String projectId = "YOUR_PROJECT_ID";

    // The job which logs you want to print.
    Job job = Job.newBuilder().build();

    readJobLogs(projectId, job);
  }

  // Prints the log messages created by given job.
  public static void readJobLogs(String projectId, Job job) throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `loggingClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (LoggingClient loggingClient = LoggingClient.create()) {

      ListLogEntriesRequest request = ListLogEntriesRequest.newBuilder()
          .addResourceNames(String.format("projects/%s", projectId))
          .setFilter(String.format("labels.job_uid=%s", job.getUid()))
          .build();

      for (LogEntry logEntry : loggingClient.listLogEntries(request).iterateAll()) {
        System.out.println(logEntry.getTextPayload());
      }
    }
  }
}

Python

Python

자세한 내용은 Batch Python API 참조 문서를 확인하세요.

Batch에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

from __future__ import annotations

from typing import NoReturn

from google.cloud import batch_v1
from google.cloud import logging

def print_job_logs(project_id: str, job: batch_v1.Job) -> NoReturn:
    """
    Prints the log messages created by given job.

    Args:
        project_id: name of the project hosting the job.
        job: the job which logs you want to print.
    """
    # Initialize client that will be used to send requests across threads. This
    # client only needs to be created once, and can be reused for multiple requests.
    log_client = logging.Client(project=project_id)
    logger = log_client.logger("batch_task_logs")

    for log_entry in logger.list_entries(filter_=f"labels.job_uid={job.uid}"):
        print(log_entry.payload)

C++

C++

자세한 내용은 Batch C++ API 참조 문서를 확인하세요.

Batch에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

#include "google/cloud/batch/v1/batch_client.h"
#include "google/cloud/logging/v2/logging_service_v2_client.h"
#include "google/cloud/location.h"
#include "google/cloud/project.h"

  [](std::string const& project_id, std::string const& location_id,
     std::string const& job_id) {
    auto const project = google::cloud::Project(project_id);
    auto const location = google::cloud::Location(project, location_id);
    auto const name = location.FullName() + "/jobs/" + job_id;
    auto batch = google::cloud::batch_v1::BatchServiceClient(
        google::cloud::batch_v1::MakeBatchServiceConnection());
    auto job = batch.GetJob(name);
    if (!job) throw std::move(job).status();

    auto logging = google::cloud::logging_v2::LoggingServiceV2Client(
        google::cloud::logging_v2::MakeLoggingServiceV2Connection());
    auto const log_name = project.FullName() + "/logs/batch_task_logs";
    google::logging::v2::ListLogEntriesRequest request;
    request.mutable_resource_names()->Add(project.FullName());
    request.set_filter("logName=\"" + log_name +
                       "\" labels.job_uid=" + job->uid());
    for (auto l : logging.ListLogEntries(request)) {
      if (!l) throw std::move(l).status();
      std::cout << l->text_payload() << "\n";
    }
  }

Batch 로그 필터링

다음 필터 매개변수 중 하나 이상과 0개 이상의 불리언 연산자(AND, OR, NOT)가 포함된 쿼리를 작성하여 Batch 로그를 필터링할 수 있습니다.

  • 특정 작업의 로그를 필터링하려면 작업의 고유 ID(UID)를 지정합니다.

    labels.job_uid=JOB_UID
    

    여기서 JOB_UID는 작업의 UID입니다. 작업의 UID를 가져오려면 작업 세부정보를 확인합니다.

  • 특정 유형의 Batch 로그를 필터링하려면 로그 유형을 지정합니다.

    logName=projects/PROJECT_ID/logs/BATCH_LOG_TYPE
    

    다음을 바꿉니다.

    • PROJECT_ID: 로그를 보려는 프로젝트의 프로젝트 ID
    • BATCH_LOG_TYPE: 보려는 Batch 로그의 유형(작업 로그의 경우 batch_task_logs, 에이전트 로그의 경우 batch_agent_logs)입니다.
  • 커스텀 상태 이벤트가 있는 로그를 필터링하려면 해당 로그에서 jsonPayload.batch/custom/event 필드를 정의해야 합니다.

    jsonPayload.batch"/"custom"/"event!=NULL_VALUE
    
  • 하나 이상의 특정 심각도의 로그를 필터링하려면 다음 비교 연산자를 지정합니다.

    severityCOMPARISON_OPERATORSEVERITY_ENUM
    

    다음을 바꿉니다.

추가 필터 옵션은 Cloud Logging 쿼리 언어 문서를 참조하세요.

다음 단계