In diesem Dokument wird beschrieben, wie Sie den Logeintrag formatieren, wenn Sie Cloud Logging zum Melden von Fehlerereignissen verwenden möchten.
Sie können Fehlerereignisse für Ihr Google Cloud -Projekt melden, indem Sie die Cloud Logging API-Methode write oder die Error Reporting API-Methode report ausführen.
Wenn Sie Fehlerereignisse mit der Cloud Logging API melden, enthält der Anfragebody ein LogEntry-Objekt, das einen Stacktrace oder ein ReportedErrorEvent-Objekt enthalten muss.
Hinweise
Folgen Sie der Einrichtungsanleitung für Ihre Sprache und Plattform.
Wenn Sie eine API-Schlüssel-Authentifizierung benötigen, müssen Sie die Error Reporting API verwenden. Wenn Sie ein Fehlerereignis mit der Error Reporting API melden möchten, führen Sie die Methode
reportaus und formatieren Sie den Anfragetext der Methode alsReportedErrorEvent-Objekt.Wenn Sie die Error Reporting API verwenden, werden automatisch Logeinträge mit korrekt formatierten Fehlermeldungen generiert und in Cloud Logging geschrieben. Diese Logeinträge werden in ein Log geschrieben, dessen
logNameso formatiert ist:projects/PROJECT_ID/clouderrorreporting.googleapis.com%2Freported_errors
Da Logeinträge durch Aufrufe von
reportgeneriert werden, können Datenaufnahmekosten in Cloud Logging anfallen. Informationen dazu, welche Logeinträge aufgenommen werden, finden Sie unter Ausschlussfilter.Wenn Sie Fehlerereignisse über die Error Reporting API melden, gilt der Rest dieses Dokuments nicht.
Formatanforderungen für LogEntry
In diesem Abschnitt wird beschrieben, wie Sie ein LogEntry formatieren, damit Error Reporting das im Logeintrag enthaltene Fehlerereignis erfasst.
Stacktrace protokollieren
Wenn Sie ein Fehlerereignis protokollieren möchten, das ein Stacktrace ist, schreiben Sie das Fehlerereignis als einen der folgenden Typen:
- Eine mehrzeilige
textPayload. Ein
jsonPayload, das ein Feldmessage,stack_traceoderexceptionenthält.Sie können mehrere dieser Felder angeben. Wenn Sie mehrere dieser Felder angeben, wird in der folgenden Reihenfolge ausgewertet:
stack_trace, dannexceptionund dannmessage.Wenn das Nachrichtenfeld ausgewertet wird und nicht leer ist, wird der Stacktrace nur erfasst, wenn das Feld einen Stacktrace in einem der unterstützten Programmiersprachenformate enthält. Die Stacktraces werden von Error Reporting nicht erfasst, wenn ein nicht unterstütztes Format verwendet wird.
Wenn Ihr Fehlerereignis als
ReportedErrorEvent-Objekt formatiert ist, kopieren Sie die Felder injsonPayload. Weitere Informationen und ein Beispiel finden Sie unter Fehler protokollieren, der alsReportedErrorEvent-Objekt formatiert ist.Ein
jsonPayload, das kein Feldmessage,stack_traceoderexceptionenthält, aber einen Stacktrace.Error Reporting durchsucht alle Felder in einem
jsonPayloadnach Stacktraces. Wenn mehr als ein Stacktrace gefunden wird, wird einer ausgewählt. Der Auswahlalgorithmus sorgt für eine einheitliche Auswahl.
SMS protokollieren
Wenn Sie ein Fehlerereignis protokollieren möchten, das eine Textnachricht ist, verwenden Sie das folgende Format für jsonPayload:
"jsonPayload": {
"@type": "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
"message": "Text message"
},
Wenn Sie das Feld @type auf den angegebenen Wert festlegen, wertet Error Reporting den Logeintrag immer so aus, als ob alle erforderlichen Felder vorhanden sind. Infolgedessen erfasst Error Reporting das Fehlerereignis.
Wenn Sie das Feld @type auf einen anderen Wert setzen oder es nicht festlegen, sucht Cloud Logging nach dem Feld mit dem Label serviceContext, um festzustellen, ob die Nutzlast ein ReportedErrorEvent-Objekt ist.
Sie müssen das Feld @type nicht festlegen, wenn die Felder message, stack_trace oder exception des jsonPayload einen Stacktrace enthalten.
In diesen Fällen erfasst Error Reporting das Fehlerereignis automatisch.
Unterstützte überwachte Ressourcen
Legen Sie das Feld resource des LogEntry-Objekts auf einen der folgenden unterstützten überwachten Ressourcentypen fest:
app_script_functionaws_ec2_instancecloud_functioncloud_run_jobscloud_run_revisionconsumed_apicontainerdataflow_stepgae_appgce_instancek8s_containerk8s_podml_job1workflows.googleapis.com/Workflowglobal1
1 textPayload wird nicht unterstützt
Beispiele
In diesem Abschnitt wird beschrieben, wie Sie dafür sorgen können, dass Error Reporting einen Logeintrag verarbeitet, wenn dieser eine Textnachricht oder einen Stacktrace enthält.
Fehlerereignis protokollieren, das eine SMS ist
Das folgende Beispiel zeigt, wie ein LogEntry-Objekt formatiert wird, wenn Sie ein Fehlerereignis protokollieren möchten, das eine Textnachricht ist. Verwenden Sie die folgende JSON-Struktur für das Feld jsonPayload des LogEntry:
{...
{
"jsonPayload": {
"@type": "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
"message": "A simple text message"
},
"logName": "projects/test-project/logs/reported-error",
"resource": {
"labels": {
"project_id": "test-project"
},
"type": "global"
},
"severity": "ERROR",
"timestamp": "2019-06-27T13:43:26.375834551Z"
}
}
Wie im Beispiel gezeigt, müssen Sie das Feld @type auf den Wert festlegen, der Error Reporting dazu zwingt, den Logeintrag zu gruppieren:
Weitere Informationen finden Sie unter Textnachricht protokollieren.
Wenn das Feld message einen Stacktrace enthält, wird der Logeintrag automatisch gruppiert. Sie müssen das Feld @type also nicht angeben.
Fehler protokollieren, der als ReportedErrorEvent-Objekt formatiert ist
Wenn Ihr Fehlerereignis in einem ReportedErrorEvent-Objekt gespeichert ist, verwenden Sie die folgende JSON-Struktur für das Feld jsonPayload des LogEntry:
{
"eventTime": string,
"serviceContext": {
"service": string, // Required.
"version": string
},
"message": string, // Required. This field contains the main error content to report.
"@type": string // Optional. For information about this field, see Log a text message.
"context": {
"httpRequest": {
"method": string,
"url": string,
"userAgent": string,
"referrer": string,
"responseStatusCode": number,
"remoteIp": string
},
"user": string,
"reportLocation": { // Required if no stack trace is provided.
"filePath": string,
"lineNumber": number,
"functionName": string
}
}
}
Achten Sie darauf, dass Sie das Feld message mit den Fehlerinformationen ausfüllen.
Informationen zum Speichern eines Stacktrace im Feld message eines ReportedErrorEvent-Objekts finden Sie auf der Referenzseite für die Methode report.
Im folgenden Beispiel wird veranschaulicht, wie das Feld jsonPayload des LogEntry als ReportedErrorEvent-Objekt formatiert wird.
Da das Feld message einen Stacktrace enthält, wird das Fehlerereignis von Error Reporting gruppiert:
{...
"jsonPayload": {
"serviceContext": {
"service": "frontend",
"version": "bf6b5b09b9d3da92c7bf964ab1664fe751104517"
},
"message": "com.example.shop.Template$CartDiv retrieveCart: Error\njava.lang.IndexOutOfBoundsException: Index: 4, Size: 4\n\tat java.util.ArrayList.rangeCheck(ArrayList.java:635)\n\tat java.util.ArrayList.get(ArrayList.java:411)\n\tat com.example.shop.Cart.retrieve(Cart.java:76)\n\tat com.example.shop.Cart.generate(Cart.java:55)\n\tat com.example.shop.Template$CartDiv.retrieveCart(Template.java:113)\n\tat com.example.shop.Template.generate(Template.java:22)\n\tat com.example.shop.CartServlet.doGet(CartServlet.java:115)\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:717)\n",
"context":
"httpRequest": {
"method": "GET",
"url": "http://example.com/shop/cart",
"responseStatusCode": 500
},
"user": "9f32f587135aa6774e78ed30fbaabcce3ec5528f"
}
},
"logName": "projects/test-project/logs/reported-error",
"resource": {
"labels": {
"project_id": "test-project"
},
"type": "global"
},
"severity": "ERROR",
"timestamp": "2019-06-27T13:43:26.375834551Z"
}
Fehlerereignis mit dem Feld textPayload protokollieren
Sie können ein Fehlerereignis aufzeichnen, indem Sie das Feld textPayload eines LogEntry verwenden, um die Fehlermeldung, z. B. einen Stacktrace, zu speichern. Der folgende Google Cloud CLI-Befehl führt beispielsweise zu einem Logeintrag, dessen Schweregrad ERROR ist und dessen Feld textPayload ein Fehlerereignis enthält:
gcloud logging write test-log --severity=ERROR --payload-type=text 'RuntimeException: Oops! Something bad happened. at com.example.MyClass.method(MyClass.java:123) at com.example.OtherClass.doStuff(Unknown Source) at com.example.Sys.create(Native Method)'
Das Ergebnis des vorherigen Befehls ist ein Logeintrag, der nach Fehlerberichterstattung gruppiert ist:
{...
logName: "projects/PROJECT_ID/logs/test-log"
severity: "ERROR"
textPayload: "RuntimeException: Oops! Something bad happened.
at com.example.MyClass.method(MyClass.java:123)
at com.example.OtherClass.doStuff(Unknown Source)
at com.example.Sys.create(Native Method)"
...
}