In diesem Dokument wird beschrieben, wie Sie den Logeintrag formatieren, wenn Sie mit Cloud Logging Fehlerereignisse melden möchten.
Sie können Fehlerereignisse in Ihrem 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 Anfragekörper ein LogEntry
-Objekt mit einem Stack-Trace oder ein ReportedErrorEvent
-Objekt.
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
report
aus und formatieren Sie den Anfragetext der Methode alsReportedErrorEvent
-Objekt.Wenn Sie die Error Reporting API verwenden, werden Logeinträge mit korrekt formatierten Fehlermeldungen automatisch generiert und in Cloud Logging geschrieben. Diese Logeinträge werden in ein Protokoll geschrieben, dessen
logName
folgendermaßen formatiert ist:projects/PROJECT_ID/clouderrorreporting.googleapis.com%2Freported_errors
Da Logeinträge durch Aufrufe von
report
generiert werden, können Datenaufnahmekosten in Cloud Logging anfallen. Informationen dazu, welche Logs aufgenommen werden, finden Sie unter Ausschlussfilter.Wenn Sie Fehlerereignisse mit der Error Reporting API melden, gilt der Rest dieses Dokuments nicht.
LogEntry
-Formatanforderungen
In diesem Abschnitt wird beschrieben, wie Sie einen LogEntry
so formatieren, dass Error Reporting das im Logeintrag enthaltene Fehlerereignis erfasst.
Stacktrace protokollieren
Wenn Sie ein Fehlerereignis protokollieren möchten, das einen Stacktrace enthält, müssen Sie das Ereignis als einen der folgenden Typen schreiben:
- Eine mehrzeilige
textPayload
. Ein
jsonPayload
, das einmessage
-,stack_trace
- oderexception
-Feld enthält.Sie können mehrere dieser Felder angeben. Wenn Sie mehrere dieser Felder angeben, wird in der folgenden Reihenfolge ausgewertet:
stack_trace
, dannexception
und dannmessage
.Wenn das Nachrichtenfeld ausgewertet wird und nicht leer ist, wird der Stack-Trace nur erfasst, wenn das Feld einen Stack-Trace in einem der unterstützten Programmiersprachenformate enthält. Der Stack-Trace wird von Error Reporting nicht erfasst, wenn ein nicht unterstütztes Format verwendet wird.
Wenn das Fehlerereignis als
ReportedErrorEvent
-Objekt formatiert ist, kopieren Sie die Felder in dasjsonPayload
. Weitere Informationen und ein Beispiel finden Sie unter Fehler protokollieren, der alsReportedErrorEvent
-Objekt formatiert ist.Ein
jsonPayload
, das kein Feldmessage
,stack_trace
oderexception
enthält, aber einen Stack-Trace.Bei der Fehlerbehebung werden alle Felder in einer
jsonPayload
nach Stack-Traces durchsucht. Wenn mehr als ein Stack-Trace gefunden wird, wird einer ausgewählt. Der Auswahlalgorithmus sorgt für eine einheitliche Auswahl.
SMS protokollieren
Wenn Sie ein Fehlerereignis erfassen möchten, das eine Textnachricht ist, verwenden Sie für jsonPayload
das folgende Format:
"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. Daher wird das Fehlerereignis von Error Reporting erfasst.
Wenn Sie das Feld @type
auf einen anderen Wert setzen oder leer lassen, sucht Cloud Logging nach dem Feld serviceContext
, um zu ermitteln, ob es sich bei der Nutzlast um ein ReportedErrorEvent
-Objekt handelt.
Sie müssen das Feld @type
nicht festlegen, wenn die Felder message
, stack_trace
oder exception
der jsonPayload
einen Stack-Trace enthalten.
In diesen Fällen wird das Fehlerereignis automatisch von Error Reporting erfasst.
Unterstützte überwachte Ressourcen
Legen Sie das Feld resource
des Objekts LogEntry
auf einen der folgenden unterstützten überwachten Ressourcentypen fest:
app_script_function
aws_ec2_instance
cloud_function
cloud_run_jobs
cloud_run_revision
consumed_api
container
dataflow_step
gae_app
gce_instance
k8s_container
k8s_pod
ml_job
1workflows.googleapis.com/Workflow
global
1
1 textPayload
wird nicht unterstützt
Beispiele
In diesem Abschnitt erfahren Sie, wie Sie dafür sorgen können, dass ein Logeintrag von der Fehlermeldung verarbeitet wird, wenn er eine Textnachricht oder einen Stack-Trace enthält.
Fehlerereignis in Form einer Textnachricht protokollieren
Das folgende Beispiel zeigt, wie Sie ein LogEntry
-Objekt formatieren, wenn Sie ein Fehlerereignis protokollieren möchten, das eine Textnachricht ist. Verwenden Sie dazu 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 das Beispiel zeigt, müssen Sie das Feld @type
auf den Wert festlegen, der die Fehlermeldung dazu zwingt, den Logeintrag zu gruppieren: Weitere Informationen finden Sie unter SMS protokollieren.
Wenn das Feld message
einen Stack-Trace enthält, wird der Logeintrag automatisch gruppiert. Sie müssen also das Feld @type
nicht angeben.
Fehler protokollieren, der als ReportedErrorEvent
-Objekt formatiert ist
Wenn das 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 } } }
Geben Sie die Fehlerinformationen in das Feld message
ein.
Informationen zum Speichern eines Stack-Traces im Feld message
eines ReportedErrorEvent
-Objekts finden Sie auf der Referenzseite der Methode report
.
Im folgenden Beispiel wird gezeigt, wie das Feld jsonPayload
des LogEntry
so formatiert wird, dass es als ReportedErrorEvent
-Objekt angezeigt 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" }
Fehlerereignisse mit dem Feld textPayload
erfassen
Sie können ein Fehlerereignis erfassen, indem Sie die Fehlerdaten im Feld textPayload
eines LogEntry
speichern. Der folgende Google Cloud CLI-Befehl führt beispielsweise zu einem Logeintrag mit der Schwerestufe ERROR
und dem Feld textPayload
, das 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 Fehlermeldungen 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)" ... }