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. Misalnya, log dapat membantu Anda men-debug tugas yang gagal.

Secara khusus, log hanya dihasilkan setelah tugas mulai berjalan dan hanya jika logging diaktifkan untuk tugas tersebut. Jika Anda perlu menganalisis tugas tanpa log, lihat peristiwa status.

Sebelum memulai

Mengaktifkan logging untuk tugas

Agar log dapat dibuat untuk suatu 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 dinonaktifkan secara default. Untuk mengaktifkan log dari Cloud Logging, sertakan konfigurasi berikut untuk kolom logsPolicy saat membuat tugas:

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

Menulis dan menghasilkan log untuk tugas

Saat log dari Cloud Logging diaktifkan untuk suatu tugas, Cloud Logging akan otomatis menghasilkan log apa pun yang ditulis untuk tugas tersebut. Secara khusus, tugas Batch dapat memiliki jenis log berikut:

  • Log agen (batch_agent_logs): log untuk aktivitas dari agen layanan Batch.

    Batch akan otomatis menulis log agen untuk setiap tugas yang telah mengaktifkan logging.

  • log tugas (batch_task_logs): mencatat log untuk data apa pun yang telah Anda konfigurasi runnable tugas untuk ditulis ke stream output standar (stdout) atau stream error standar (stderr).

    Secara opsional, Anda dapat menulis log tugas untuk setiap tugas yang telah mengaktifkan logging.

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 langkah berikut:

  1. Di konsol Google Cloud, buka halaman Job list.

    Buka Daftar tugas

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

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

  4. Opsional: Untuk memfilter log, lakukan salah satu tindakan 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 API Batch Go.

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

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

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

Untuk mengautentikasi ke Batch, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca 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 API Batch Python.

Untuk mengautentikasi ke Batch, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca 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 API Batch C++.

Untuk mengautentikasi ke Batch, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca 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";
    }
  }

Filter Log Batch

Anda dapat memfilter log Batch dengan menulis kueri yang menyertakan satu atau beberapa parameter filter berikut serta 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 yang memiliki satu atau beberapa tingkat keparahan tertentu, tentukan perbandingan berikut:

    severityCOMPARISON_OPERATORSEVERITY_ENUM
    

    Ganti kode berikut:

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

Langkah selanjutnya