この記事はZOZO Advent Calendar 2024 シリーズ 1 の 9 日目の記事です。
はじめに
Goggle Cloud には Cloud Logging というログ管理サービスがあり、JSON 形式で書き込まれたログを構造化ログとして記録することができます。
Cloud Logging で提供される特別な JSON フィールドを活用することでログの記録や検索・分析の効率が向上します。
この記事では、特別な JSON フィールドの1つである message フィールドについて構造化ログを渡した時に特殊な挙動をとるので記事にまとめました。
構造化ログとは
機械的に読み取り可能なフォーマットでキーと値が書き込まれている形式のログのことです。
例えば以下のような形式のログが構造化ログと言います。
{
"pri": "6",
"host": "192.168.0.1",
"ident": "fluentd",
"pid": "11111",
"message": "[error] Syslog test"
}
CloudLogging の仕様について
Cloud Logging では JSON 形式で出力されたログを構造化ログとして認識します。
特別な JSON フィールドと認識された場合、Cloud Logging 側で自動的に処理され意図しないログフォーマットになることがあります。
特別な JSON フィールド
Google Cloud の構造化ロギングで使用される特定のキーのことで、ログエントリに特定の意味や挙動を持つことがあります。
例えば以下のようなものがあります
- severity フィールド:ログ エントリに記述されたイベントの重大度(INFO, ERROR, WARNINGなど)を示す
- timestamp フィールド:ログのタイムスタンプを指定する際に使用される
- message フィールド:Cloud Logging に保存され、設定した文字列が表示される
今回は message フィールドについて検証したことを書いていきます。
messageフィールドについて
Cloud Logging において message フィールドは構造化ログの渡し方によって動作が異なり、以下のような動作をします。
パターン1: message のみ入力した場合
以下のように構造化ログを設定してCloud Logging に保存してみました。
{
"severity": "ERROR",
"time": "2024-12-06T07:12:45:769Z",
"message": "Sample log message"
}
severity フィールドと time フィールドはそれぞれ対応した LogEntry フィールドに保存されます。
他に特別な JSON フィールドを除く構造化データがない場合、message フィールドの値は textPayload に保存されます。
また、message フィールド以外に特別な JSON フィールドがなく複数の message フィールドが渡されると、それらの値は自動的に結合されて textPayload に保存されます。
{
"severity": "ERROR",
"time": "2024-12-06T07:03:37:169Z",
"message": "message1"
"message": "message2"
}
パターン2: message 以外のキーを渡している場合
message フィールドに加えて新しいキーと値を追加して以下のように構造化ログを設定してCloud Logging に保存してみました。
{
"severity": "ERROR",
"time": "2024-12-06T07:20:56:174Z",
"message": "Line Notification is not allow"
"msg": "Line Notification is not allow"
}
この場合、message フィールドと msg フィールドの値は jsonPayload に保存されます。
このように message 以外に新しくフィールドを追加した構造化ログを渡すことで jsonPayload フィールドに保存することができます
まとめ
Cloud Logging の仕様を踏まえて、特別な JSON フィールドである message フィールドの扱いについて検証した結果をまとめました。
ログを設計するときの参考になれば嬉しいです。
最後まで読んでいただきありがとうございました!