Menganalisis tugas menggunakan log

Dokumen ini menjelaskan cara mengaktifkan, membuat, dan melihat log dari Cloud Logging untuk tugas Batch.

Anda dapat menggunakan log untuk mendapatkan informasi yang berguna untuk menganalisis tugas Anda. Misalnya, log dapat membantu Anda men-debug tugas yang gagal.

Perlu diperhatikan bahwa log hanya dibuat setelah tugas mulai berjalan dan hanya jika logging diaktifkan untuk tugas tersebut. Jika Anda perlu menganalisis tugas tanpa log, lihat peristiwa status.

Sebelum memulai

  1. Jika belum pernah menggunakan Batch, baca Mulai menggunakan Batch dan aktifkan Batch dengan menyelesaikan prasyarat untuk project dan pengguna.
  2. Untuk mendapatkan izin yang Anda perlukan untuk menganalisis tugas menggunakan log, minta administrator untuk memberi Anda peran IAM berikut:

    Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

    Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Mengaktifkan logging untuk tugas

Agar log dapat dibuat untuk tugas, aktifkan log dari Cloud Logging saat Anda membuat tugas:

  • Jika Anda membuat tugas menggunakan konsol Google Cloud, log dari Cloud Logging selalu diaktifkan.
  • Jika Anda membuat tugas menggunakan gcloud CLI atau Batch API, log dari Cloud Logging akan dinonaktifkan secara default. Untuk mengaktifkan log dari Cloud Logging, sertakan konfigurasi berikut untuk kolom logsPolicy saat membuat tugas:

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

Menulis dan membuat log untuk tugas

Jika log dari Cloud Logging diaktifkan untuk tugas, Cloud Logging akan otomatis membuat log yang ditulis untuk tugas tersebut. Secara khusus, tugas Batch dapat memiliki jenis log berikut:

Melihat log khusus tugas

Anda dapat melihat log tugas menggunakan konsol Google Cloud, gcloud CLI, Logging API, Go, Java, Python, atau C++.

Konsol

Untuk melihat log tugas menggunakan konsol Google Cloud, lakukan hal berikut:

  1. Di konsol Google Cloud, buka halaman Daftar tugas.

    Buka Daftar tugas

  2. Di kolom Nama tugas, klik nama tugas. Halaman Detail tugas akan terbuka.

  3. Klik tab Logs. Batch menampilkan semua log yang terkait dengan tugas.

  4. Opsional: Untuk memfilter log, lakukan salah satu hal berikut:

gcloud

Untuk melihat log menggunakan gcloud CLI, gunakan perintah gcloud logging read:

gcloud logging read "QUERY"

dengan QUERY adalah kueri untuk log Batch yang berisi Parameter filter batch.

API

Untuk melihat log menggunakan Logging API, gunakan metode entries.list:

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

Ganti kode berikut:

Go

Go

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Batch Go API.

Untuk melakukan autentikasi ke Batch, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

import (
	"context"
	"fmt"
	"io"

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

// 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

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Batch Java API.

Untuk melakukan autentikasi ke Batch, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Batch Python API.

Untuk melakukan autentikasi ke Batch, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

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++

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Batch C++ API.

Untuk melakukan autentikasi ke Batch, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

#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";
    }
  }

Memfilter log Batch

Anda dapat memfilter log Batch dengan menulis kueri yang menyertakan satu atau beberapa parameter filter berikut dan nol atau beberapa operator boolean (AND, OR, dan NOT).

  • Untuk memfilter log dari tugas tertentu, tentukan ID unik (UID) tugas:

    labels.job_uid=JOB_UID
    

    dengan JOB_UID adalah UID tugas. Untuk mendapatkan UID tugas, lihat detail tugas.

  • Untuk memfilter jenis log Batch tertentu, tentukan jenis log:

    logName=projects/PROJECT_ID/logs/BATCH_LOG_TYPE
    

    Ganti kode berikut:

    • PROJECT_ID: project ID project yang lognya ingin Anda lihat.
    • BATCH_LOG_TYPE: jenis log Batch yang ingin Anda lihat, batch_task_logs untuk log tugas atau batch_agent_logs untuk log agen.
  • Untuk memfilter log dengan peristiwa status kustom, tentukan bahwa log harus menentukan kolom jsonPayload.batch/custom/event:

    jsonPayload.batch"/"custom"/"event!=NULL_VALUE
    
  • Untuk memfilter log dari satu atau beberapa tingkat keparahan tertentu, tentukan perbandingan berikut:

    severityCOMPARISON_OPERATORSEVERITY_ENUM
    

    Ganti kode berikut:

Untuk mengetahui opsi filter lainnya, lihat dokumentasi bahasa kueri Cloud Logging.

Langkah selanjutnya