ログを使用してジョブを分析する

このページでは、ジョブの 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 Console を使用してジョブを作成すると、Cloud Logging が常に有効になります。
  • gcloud CLI または Batch API を使用してジョブを作成する場合、Cloud Logging はデフォルトで無効になっています。Cloud Logging を有効にするには、ジョブの作成時に次の構成を logsPolicy フィールドに含めます。

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

ジョブのログを表示する

Google Cloud コンソール、gcloud CLI、Logging API、Go、Java、Python を使用して、Cloud Logging でジョブのログを表示できます。

コンソール

Google Cloud コンソールを使用してジョブのログを表示する手順は次のとおりです。

  1. Google Cloud コンソールで、[ジョブリスト] ページに移動します。

    ジョブリストに移動する

  2. [ジョブ名] 列で、ジョブの名前をクリックします。ジョブの詳細ページが開きます。

  3. [イベント] タブをクリックします。

  4. [ログ] セクションで、 Cloud Logging をクリックします。[ログ エクスプローラ] ページが開きます。

    デフォルトでは、ログ エクスプローラにはこのジョブのすべてのタスクログが表示されます。

    推奨: 表示するログをフィルタリングするには、クエリを作成します。たとえば、クエリエディタ フィールド内でバッチログのクエリを入力します。

gcloud

gcloud CLI を使用してログを表示するには、gcloud logging read コマンドを使用します。

gcloud logging read "QUERY"

ここで、QUERYBatch ログのクエリです。

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)

Batch ログをフィルタリングするクエリを作成する

Batch ログをフィルタするには、次のフィルタ パラメータ 1 つ以上と、0 個以上のブール演算子(ANDORNOT)を含むクエリを作成します。

  • 特定のジョブのログをフィルタリングするには、ジョブの一意の 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)。

次のステップ