로그를 사용하여 작업 분석

이 페이지에서는 작업의 Cloud Logging에서 로그를 사용 설정하고 보는 방법을 설명합니다.

로그를 사용하여 작업 분석에 유용한 정보를 가져올 수 있습니다. 예를 들어 로그는 실패한 작업을 디버깅하는 데 도움이 될 수 있습니다. 작업에 Cloud Logging이 사용 설정된 경우 Cloud Logging은 확인할 수 있는 다음 유형의 로그를 생성합니다.

  • 태스크 로그(batch_task_logs): 표준 출력(stdout) 및 표준 오류(stderr) 스트림에 기록된 모든 데이터의 로그입니다. 작업의 태스크 로그를 생성하려면 분석 및 디버깅을 위해 이러한 스트림에 데이터를 기록하도록 태스크를 구성합니다.
  • 에이전트 로그(batch_agent_logs): Batch 서비스 에이전트의 활동에 대한 로그입니다. Batch는 작업에 대한 이러한 로그를 자동으로 생성합니다.

Cloud Logging은 작업 실행이 시작된 후에만 로그를 생성합니다. 작업이 실행되었는지 확인하려면 작업 세부정보를 확인하고 작업의 상태RUNNING 또는 그 이후의 상태인지 확인합니다. 예를 들어 작업이 RUNNING 상태 이전에 실패하여 로그를 생성하지 않은 작업을 분석해야 하는 경우 gcloud CLI 또는 Batch API를 사용하여 작업의 세부정보를 확인하고 statusEvents 필드를 확인합니다.

시작하기 전에

작업 로그 사용 설정

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

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

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

작업 로그 보기

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

자세한 내용은 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)입니다.

다음 단계