In diesem Dokument wird beschrieben, wie Sie Aufgabenlogs schreiben und einen Batchjob mit Aufgabenlogs erstellen und ausführen.
Wenn das Logging für einen Job aktiviert ist, werden Aufgabenlogs aus Meldungen generiert, die die Runnables des Jobs während der Laufzeit ausgeben. Wenn Sie Ihre Runnables zum Schreiben von Aufgabenlogs konfigurieren, können Sie benutzerdefinierte Informationen in Cloud Logging bereitstellen, wodurch die Analyse und Fehlerbehebung Ihrer Jobs einfacher wird. Weitere Informationen zu Logs finden Sie unter Job mithilfe von Logs analysieren.
Hinweise
- Wenn Sie Batch noch nicht verwendet haben, lesen Sie Erste Schritte mit Batch. Aktivieren Sie Batch, indem Sie die Voraussetzungen für Projekte und Nutzer erfüllen.
-
Bitten Sie den Administrator, Ihnen die folgenden IAM-Rollen zu gewähren, damit Sie die Berechtigungen erhalten, die Sie zum Erstellen eines Jobs zum Schreiben von Logs benötigen:
-
So erstellen Sie einen Job:
-
Batchjob-Bearbeiter (
roles/batch.jobsEditor
) für das Projekt -
Dienstkontonutzer (
roles/iam.serviceAccountUser
) für das Dienstkonto des Jobs, das standardmäßig das Compute Engine-Standarddienstkonto ist
-
Batchjob-Bearbeiter (
-
So rufen Sie Logs auf:
Loganzeige (
roles/logging.viewer
) für das Projekt
Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff verwalten.
Möglicherweise können Sie die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.
-
So erstellen Sie einen Job:
Job mit Aufgabenlogs erstellen und ausführen
Gehen Sie beim Erstellen des Jobs so vor, um einen Job zu erstellen und auszuführen, der Aufgabenlogs erhalten soll:
- Aktivieren Sie Logs für den Job. Dadurch können alle für den Job geschriebenen Logs generiert werden.
Fügen Sie für jedes Aufgabenlog, das der Job haben soll, einen Befehl hinzu, der ein Aufgabenlog in ein Runnable schreibt. Wenn der Job ausgeführt wird, wird jedes Mal ein Aufgabenlog generiert, wenn ein Befehl zum Schreiben eines Aufgabenlogs ausgeführt wird.
Informationen zum Schreiben von Aufgabenlogs finden Sie in diesem Dokument unter Aufgabenlogs schreiben.
Aufgabenlogs schreiben
Ein Tasklog wird für alle Inhalte geschrieben, die die Runnables eines Jobs während der Laufzeit in den Standardausgabestream (stdout
) oder Standardfehlerstream (stderr
) ausgeben. Aufgabenlogs können beispielsweise mit dem Befehl echo
geschrieben werden.
Die Struktur des resultierenden Aufgabenlogs variiert je nachdem, wie Sie den gedruckten Inhalt formatiert haben. Insbesondere können Sie jedes Aufgabenlog mit einer der folgenden Optionen schreiben:
Einen String ausgeben, um ein unstrukturiertes Log zu schreiben Unstrukturierte Logs sind einfach und Sie können nur das Feld
textPayload
des Logs definieren.Einen strukturierten Log durch Drucken von JSON schreiben Strukturierte Logs erfordern eine JSON-Formatierung, mit der Sie mehrere Felder definieren können, einschließlich einiger Standard-Logfelder, benutzerdefinierter Felder und benutzerdefinierter Statusereignisse.
Beispielsweise können Sie mithilfe von strukturierten Aufgabenlogs den Schweregrad des Logs definieren und als Filter verwenden, wenn Sie Logs für einen Job ansehen.
Durch Ausgabe eines Strings ein unstrukturiertes Log schreiben
Mit unstrukturierten Logs können Sie eine Nachricht definieren. Dabei handelt es sich um einen String, der im Feld textPayload
des Logs angezeigt wird.
Wenn Sie ein unstrukturiertes Log schreiben möchten, geben Sie einen unformatierten String aus, wie in den folgenden Abschnitten gezeigt.
Beispiel für ein unstrukturiertes Log
Angenommen, Sie benötigen ein Aufgabenlog, das den folgenden String enthält:
MESSAGE
Wenn Sie diesen Beispielstring ausgeben, erhalten Sie ein Aufgabenprotokoll, das in etwa so aussieht:
insertId: ...
labels: ...
logName: projects/PROJECT_ID/logs/batch_task_logs
receiveTimestamp: ...
resource: ...
severity: INFO
textPayload: MESSAGE
timestamp: ...
Ersetzen Sie Folgendes:
MESSAGE
: die Nachricht. Dabei handelt es sich um einen String, der den Zweck des Aufgabenlogs zusammenfasst, z. B.The summary for a task log.
.PROJECT_ID
: die Projekt-ID Ihres Projekts.
String ausgeben
Sie können einen String mit verschiedenen Methoden ausgeben, z. B. indem Sie den folgenden echo
-Befehl in ein Runnable aufnehmen:
echo MESSAGE
Umfassende Beispiele für Jobs, bei denen der Befehl echo
zum Schreiben unstrukturierter Aufgabenlogs verwendet wird, finden Sie unter Einfachen Job erstellen und ausführen.
Strukturiertes Log durch Drucken eines JSON-Objekts schreiben
In strukturierten Logs können Sie Folgendes definieren:
- Vom Cloud Logging-Agent unterstützte Standardfelder
- Benutzerdefinierte Felder
- Benutzerdefinierte Statusereignisse
Wenn Sie ein strukturiertes Log schreiben möchten, geben Sie ein JSON-Objekt aus. In den folgenden Abschnitten wird gezeigt, wie Sie ein Log mit einigen Standardfeldern und benutzerdefinierten Feldern definieren. Informationen zum Definieren eines Logs mit benutzerdefinierten Statusereignissen finden Sie unter Benutzerdefinierte Statusereignisse konfigurieren.
Beispiel für ein strukturiertes Protokoll
Angenommen, Sie möchten ein Aufgabenlog, das die Informationen im folgenden JSON-Objekt enthält, das eine Nachricht, einen Schweregrad und zwei benutzerdefinierte Felder definiert.
{
"message": "MESSAGE"
"severity": "SEVERITY"
"CUSTOM_FIELD_1": CUSTOM_VALUE_1
"CUSTOM_FIELD_2": CUSTOM_VALUE_2
}
Wenn Sie dieses JSON-Objekt ausgeben, erhalten Sie ein Aufgabenprotokoll, das in etwa so aussieht:
insertId: ...
jsonPayload:
"CUSTOM_FIELD_1": CUSTOM_VALUE_1
"CUSTOM_FIELD_2": CUSTOM_VALUE_2
message: MESSAGE
labels: ...
logName: projects/PROJECT_ID/logs/batch_task_logs
receiveTimestamp: ...
resource: ...
severity: SEVERITY
timestamp: ...
Ersetzen Sie Folgendes:
MESSAGE
: die Nachricht. Dabei handelt es sich um einen String, der den Zweck des Aufgabenlogs zusammenfasst, z. B.The summary for a task log.
.SEVERITY
: Der Schweregrad des Logs, den Sie als Filter verwenden können, wenn Sie Logs für einen Job ansehen. Der Schweregrad muss einer derLogSeverity
-Enums sein, die in einen String umgewandelt wurden, in dem nur der erste Buchstabe großgeschrieben wird. Geben Sie beispielsweise für die AufzählungERROR
den WertError
an.CUSTOM_FIELD_1
undCUSTOM_FIELD_2
: die Namen der benutzerdefinierten Felder für das Aufgabenlog, z. B.custom_field_1
undcustom_field_2
.CUSTOM_VALUE_1
undCUSTOM_VALUE_2
: die Werte benutzerdefinierter Felder für das Aufgabenlog. Dabei kann es sich um verschiedene Datentypen handeln und Anführungszeichen erforderlich sind, z. B."the first custom field"
und2
.PROJECT_ID
: die Projekt-ID Ihres Projekts.
JSON-Objekt ausgeben
Sie können dieses JSON-Beispielobjekt mit verschiedenen Methoden ausgeben. Die folgenden Beispiele veranschaulichen einige der möglichen Methoden zum Drucken des JSON-Beispielobjekts:
- Geben Sie mit dem Befehl
echo
einen entsprechenden String aus. Ein äquivalentes Wörterbuch mit Python ausgeben.
Echo-Befehl
Wenn Sie das JSON-Beispielobjekt mit dem Befehl echo
und einem entsprechenden String ausgeben möchten, fügen Sie den folgenden Befehl in ein Runnable ein:
echo '{\"message\":\"MESSAGE\", \"severity\":\"SEVERITY\", \"CUSTOM_FIELD_1\":CUSTOM_VALUE_1, \"CUSTOM_FIELD_2\":CUSTOM_VALUE_2}'
Angenommen, Sie erstellen einen Job mit der folgenden ausführbaren Datei und führen ihn aus:
"script": {
"text": "echo '{\"message\":\"The message for a structured log.\", \"severity\":\"Error\", \"custom_field_1\":\"the first custom field\", \"custom_field_2\":2}'"
}
Dann sieht das resultierende Aufgabenprotokoll in etwa so aus:
insertId: ...
jsonPayload:
custom_field_1: the first custom field
custom_field_2: 2
message: The summary for a structured task log with error severity.
labels: ...
logName: projects/PROJECT_ID/logs/batch_task_logs
receiveTimestamp: ...
resource: ...
severity: ERROR
timestamp: ...
Python
Wenn Sie das JSON-Beispielobjekt mit Python und einem entsprechenden Wörterbuch ausgeben möchten, fügen Sie das folgende Beispiel in ein ausführbares Objekt ein:
#!/usr/bin/env python3
import json
entry = dict(
severity="SEVERITY",
message="MESSAGE",
CUSTOM_FIELD_1=CUSTOM_VALUE_1,
CUSTOM_FIELD_2=CUSTOM_VALUE_2,
)
print(json.dumps(entry))
Angenommen, Sie erstellen einen Job mit der folgenden ausführbaren Datei und führen ihn aus:
"script": {
"text": "#!/usr/bin/env python3\n\nimport json\n\nentry = dict(\nseverity=\"Error\",\nmessage=\"The summary for a structured task log with error severity.\",\ncustom_field_1=\"the first custom field\",\ncustom_field_2=2,\n)\nprint(json.dumps(entry))"
}
Dann sieht das resultierende Aufgabenprotokoll in etwa so aus:
insertId: ...
jsonPayload:
custom_field_1: the first custom field
custom_field_2: 2
message: The summary for a structured task log with error severity.
labels: ...
logName: projects/PROJECT_ID/logs/batch_task_logs
receiveTimestamp: ...
resource: ...
severity: ERROR
timestamp: ...
Nächste Schritte
- Weitere Informationen zum Formatieren von Logs finden Sie in der Cloud Logging-Dokumentation unter Strukturiertes Logging.
- Weitere Informationen zum Schreiben strukturierter Aufgabenprotokolle, die benutzerdefinierte Statusereignisse enthalten
- Aufgabenlogs für einen Job ansehen
- Möglichkeiten zur Joberstellung