Job mit Logs analysieren

Auf dieser Seite wird beschrieben, wie Sie Logs aus Cloud Logging für einen Job aktivieren und ansehen.

Mit Logs können Sie Informationen abrufen, die für die Analyse Ihrer Jobs nützlich sind. Logs können beispielsweise bei der Fehlerbehebung fehlgeschlagener Jobs helfen. Wenn Cloud Logging für einen Job aktiviert ist, generiert Cloud Logging die folgenden Logtypen, die Sie ansehen können:

  • Aufgabenlogs (batch_task_logs): Logs für alle Daten, die in die Streams von Standardausgabe (stdout) und Standardfehler (stderr) geschrieben werden. Zum Generieren von Tasklogs für den Job konfigurieren Sie Ihre Aufgaben so, dass Daten für die Analyse und zur Fehlerbehebung in diesen Streams geschrieben werden.
  • Agent-Logs (batch_agent_logs): Logs für Aktivitäten aus dem Batch-Dienst-Agent. Batch erstellt diese Logs automatisch für Ihren Job.

Beachten Sie, dass Cloud Logging Logs erst generiert, wenn ein Job gestartet wird. Wenn Sie prüfen möchten, ob ein Job gestartet wurde, beschreiben Sie den Job und prüfen Sie, ob der Status des Jobs RUNNING oder ein neuerer Status ist. Wenn Sie einen Job analysieren möchten, der keine Logs generiert hat, z. B. weil der Job vor dem Status RUNNING fehlgeschlagen ist, beschreiben Sie den Job mithilfe der gcloud CLI oder der Batch API und prüfen Sie das Feld statusEvents.

Hinweis

Logs für einen Job aktivieren

Wenn Sie Logs für einen Job generieren möchten, aktivieren Sie beim Erstellen des Jobs Cloud Logging:

  • Wenn Sie einen Job über die Google Cloud Console erstellen, ist Cloud Logging immer aktiviert.
  • Wenn Sie einen Job über die gcloud CLI oder die Batch API erstellen, ist Cloud Logging standardmäßig deaktiviert. Fügen Sie beim Aktivieren des Cloud Loggings beim Erstellen des Jobs die folgende Konfiguration für das Feld logsPolicy hinzu:

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

Logs für einen Job ansehen

Sie können die Logs eines Jobs in Cloud Logging mit der Google Cloud Console, gcloud CLI, Logging API, Go, Java oder Python ansehen.

Console

So rufen Sie die Logs eines Jobs mit der Google Cloud Console auf:

  1. Rufen Sie in der Google Cloud Console die Seite Jobliste auf.

    Zur Jobliste

  2. Klicken Sie in der Spalte Jobname auf den Namen eines Jobs. Die Seite Jobdetails wird geöffnet.

  3. Klicken Sie auf den Tab Events (Ereignisse).

  4. Klicken Sie im Bereich Logs auf  Cloud Logging. Die Seite Log-Explorer wird geöffnet.

    Standardmäßig werden im Log-Explorer alle Tasklogs für diesen Job angezeigt.

    Empfohlen: Erstellen Sie Abfragen, um zu filtern, welche Logs angezeigt werden. Geben Sie beispielsweise eine Abfrage für Batchlogs in das Feld Abfrageeditor ein.

gcloud

Verwenden Sie den Befehl gcloud logging read, um Logs mit der gcloud CLI aufzurufen:

gcloud logging read "QUERY"

Dabei ist QUERY eine Abfrage für Batchlogs.

API

Wenn Sie Logs mit der Logging API ansehen möchten, verwenden Sie die Methode entries.list:

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

Dabei gilt:

Einfach loslegen (Go)

Go

Weitere Informationen finden Sie in der Referenzdokumentation zur Batch Go API.

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: %v", err)
	}
	defer batchClient.Close()

	adminClient, err := logadmin.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("Failed to create logadmin client: %v", 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: %v", 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

Weitere Informationen finden Sie in der Referenzdokumentation zur Batch Java API.


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

Weitere Informationen finden Sie in der Referenzdokumentation zur Batch Python API.

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)

Abfragen zum Filtern nach Batchlogs schreiben

Sie können nach Batchlogs filtern, indem Sie eine Abfrage schreiben, die einen oder mehrere der folgenden Filterparameter und keine oder mehrere boolesche Operatoren (AND, OR und NOT) enthält.

  • Geben Sie die eindeutige ID des Jobs an, um nach Logs eines bestimmten Jobs zu filtern:

    labels.job_uid=JOB_UID
    

    Dabei ist JOB_UID die UID des Jobs. Wenn Sie die UID eines Jobs abrufen möchten, beschreiben Sie den Job.

  • Geben Sie den Logtyp an, um nach einem bestimmten Batch-Typ zu filtern:

    logName=projects/PROJECT_ID/logs/BATCH_LOG_TYPE
    

    Dabei gilt:

    • PROJECT_ID: Die Projekt-ID des Projekts, für das Sie Logs aufrufen möchten.
    • BATCH_LOG_TYPE: der Typ der Batchlogs, die Sie ansehen möchten, entweder batch_task_logs für Aufgabenlogs oder batch_agent_logs für Agent-Logs.

Nächste Schritte