Cloud Logging のログエントリをフォーマットして、Error Reporting がアプリケーション エラーを自動的にキャプチャしてグループ化できるようにします。これにより、サービス全体で問題をモニタリングして診断できます。
Cloud Logging を使用してログエントリを書き込む場合、LogEntry オブジェクトにはスタック トレースまたはフォーマットされた ReportedErrorEvent オブジェクトが含まれている必要があります。次のセクションを使用して、テキスト ペイロードと JSON フィールド(message、stack_trace、@type など)をフォーマットし、Error Reporting がエラーイベントを正しく解析してグループ化できるようにします。
始める前に
ご使用の言語とプラットフォームの設定手順に従います。
API キーベースの認証が必要な場合は、Error Reporting API を使用する必要があります。Error Reporting API を使用してエラーイベントを報告するには、メソッド
reportを実行して、メソッドのリクエスト本文をReportedErrorEventオブジェクトとしてフォーマットします。Error Reporting API を使用すると、適切な形式のエラー メッセージを含むログエントリが自動的に生成され、Cloud Logging に書き込まれます。これらのログエントリは、
logNameが次のようにフォーマットされたログに書き込まれます。projects/PROJECT_ID/clouderrorreporting.googleapis.com%2Freported_errors
ログエントリは
reportの呼び出しによって生成されるため、Cloud Logging の取り込み料金が発生する可能性があります。取り込むログエントリを制御するには、除外フィルタをご覧ください。Error Reporting API を使用してエラーイベントを報告する場合は、このドキュメントの残りの部分は適用されません。
LogEntry 形式の要件
このセクションでは、Error Reporting がログエントリに含まれるエラーイベントをキャプチャするように LogEntry をフォーマットする方法について説明します。
スタック トレースをログに記録する
スタック トレースであるエラーイベントをログに記録するには、エラーイベントを次のいずれかのタイプとして記述します。
- 複数行の
textPayload。 message、stack_trace、exceptionフィールドを含むjsonPayload。これらのフィールドは複数指定できます。これらのフィールドが複数指定されている場合、評価は
stack_trace、exception、messageの順で行われます。messageフィールドが評価され、空でない場合、スタック トレースは、フィールドにサポートされているプログラミング言語形式のいずれかのスタック トレースが含まれている場合にのみキャプチャされます。サポートされていない形式が使用されている場合、スタック トレースは Error Reporting によってキャプチャされません。エラー イベントが
ReportedErrorEventオブジェクトとしてフォーマットされている場合は、そのフィールドをjsonPayloadにコピーします。詳細と例については、ReportedErrorEventオブジェクトとしてフォーマットされたエラーをログに記録するをご覧ください。message、stack_trace、exceptionフィールドを含まないものの、スタック トレースは含まれているjsonPayload。Error Reporting は、
jsonPayloadのすべてのフィールドでスタック トレースを検索します。複数のスタック トレースが見つかった場合は、1 つのスタック トレースが選択されます。選択アルゴリズムにより、一貫した選択が保証されます。
テキスト メッセージをログに記録する
テキスト メッセージのエラーイベントをログに記録するには、jsonPayload に次の形式を使用します。
"jsonPayload": {
"@type": "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
"message": "Text message"
},
@type フィールドに指定された値を設定すると、Error Reporting は常にすべての必須フィールドが存在するものとしてログエントリを評価します。その結果、Error Reporting はエラーイベントをキャプチャします。
@type フィールドに別の値を設定するか、未設定の場合、Cloud Logging は serviceContext というラベルの付いたフィールドを検索して、ペイロードが ReportedErrorEvent オブジェクトかどうかを判断します。
jsonPayload の message、stack_trace、exception フィールドにスタック トレースが含まれている場合、@type フィールドを設定する必要はありません。このような場合、Error Reporting はエラーイベントを自動的にキャプチャします。
サポートされているモニタリング対象リソース
LogEntry オブジェクトの resource フィールドを、サポートされている次のいずれかのモニタリング対象リソースタイプに設定します。
app_script_functionaws_ec2_instancecloud_functioncloud_run_jobscloud_run_revisionconsumed_apicontainerdataflow_stepgae_appgce_instancek8s_containerk8s_podml_job1workflows.googleapis.com/Workflowglobal1
1 textPayload はサポートされません
例
このセクションでは、ログエントリにテキスト メッセージまたはスタック トレースが含まれている場合に、Error Reporting がログエントリを処理するようにする方法について説明します。
テキスト メッセージのエラーイベントをログに記録する
テキスト メッセージのエラーイベントをログに記録するには、jsonPayload フィールドに次の JSON 構造を使用して 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"
}
}
この例に示すように、@type フィールドを、Error Reporting にログエントリをグループ化する値に設定する必要があります。詳しくは、テキスト メッセージをログに記録するをご覧ください。
message フィールドにスタック トレースが含まれている場合、ログエントリは自動的にグループ化されるため、@type フィールドを指定する必要はありません。
ReportedErrorEvent オブジェクトとしてフォーマットされたエラーをログに記録する
エラーイベントが ReportedErrorEvent オブジェクトに保存されている場合は、LogEntry の jsonPayload フィールドに次の JSON 構造を使用します。
{
"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
}
}
}
message フィールドにエラー情報を入力してください。スタック トレースを ReportedErrorEvent オブジェクトの message フィールドに保存するには、詳細については、report メソッドのリファレンス ページをご覧ください。
次の例では、LogEntry の jsonPayload フィールドを ReportedErrorEvent オブジェクトとしてフォーマットするように設定する方法を示します。message フィールドにスタック トレースが含まれているため、エラーイベントは Error Reporting によってグループ化されます。
{...
"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"
}
textPayload フィールドを使用してエラーイベントをログに記録する
LogEntry の textPayload フィールドを使用して、スタック トレースなどのエラー メッセージを保存することで、エラーイベントを記録できます。たとえば、次の Google Cloud CLI コマンドを実行すると、重大度レベルが ERROR で、textPayload フィールドにエラー イベントが含まれるログエントリが生成されます。
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)'
前のコマンドの結果は、Error Reporting でグループ化されたログエントリです。
{...
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)"
...
}