LoginSignup
3
7

More than 3 years have passed since last update.

【Golang】GCP用のフォーマットでログ出力する

Last updated at Posted at 2020-07-04

概要

GCPにはログ管理用プロダクトCloud Logging(旧Stackdriver Logging)があります。
GKEやCloud Runを使う場合、標準出力で出したログを自動で収集してくれてとても便利です。

“” 2020-07-04 18.28.16.jpg

これだけでも全然嬉しいのですが、GCPの定義しているフォーマットで構造化したログを出力すればもう少しいい感じに出来るので試してみます。

GCPのログについて

https://cloud.google.com/logging/docs/agent/configuration#special-fields
GCPのfluentdではこの「構造化ペイロード」のJSONフォーマットで出力すれば、
Cloud Loggingのログ構造であるLogEntryに対応付けてくれます。

LogEntry

https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry
今回は以下3点のfieldを意識します。

  • severity
    • ログレベル
    • INFOやERROR、FATALなどが定義してある
    • Cloud Logging上ではUIでログレベルによる絞り込みが容易に可能
  • timestamp
    • おそらくtimestampを定義していない場合はfluentdがログを検出したタイミングやCloud LoggingにLogEntryが登録されたタイミングのログがtimestampに登録されるはず
    • timestampを出力に含めておけばログ出力したタイミングを残せる
  • jsonPayload
    • ログ出力したいメッセージ
    • 前途の構造化ペイロードのmessageに対応付けられる

HttpRequest

https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#httprequest
HTTPのリクエストはこの構造で出力するとCloud Loggingでかなりいい感じに表示してくれます。

(背景色が灰色なログ)
“” 2020-07-04 19.15.47.jpg

Error Reporting

https://cloud.google.com/error-reporting
GCPではリアルタイムにエラーを管理するのにError Reportingの使用を推奨しています。
エラー発生時の通知はもちろん、エラー発生頻度や発生したコード位置なども表示してくれます。
“” 2020-07-04 19.18.42.jpg

このError Reportingへのエラー報告はクライアントライブラリを使う方法がありますが、
特定フォーマットのログを標準出力しCloud Logging経由で報告する方法もあります。
https://cloud.google.com/error-reporting/docs/formatting-error-messages

特定フォーマットは以下のReportedErrorEventになります。
https://cloud.google.com/error-reporting/reference/rest/v1beta1/projects.events/report?hl=ja#ReportedErrorEvent

ただし、埋めるところが多いので...
@typefieldでtype.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEventをvalueに持ったJSONフォーマットのログを出力することでもOKです。
https://cloud.google.com/error-reporting/docs/formatting-error-messages#@type

実際に出力

logrusとechoをカスタマイズしてみる

コード
https://github.com/suecideTech/sample-codes/tree/master/go-gcp-logging/logrusLogging

出力
“” 2020-07-04 19.38.33.jpg

severityによるログマークの違い、HttpRequestによるリクエスト情報の可視化が出来ているかなと思います。

zap(zapdriver)を使ってみる

爆速ロギングパッケージzapをcloud logging用にカスタマイズしたパッケージ、zapdriverが既にあるためそれを利用してみます。
https://github.com/blendle/zapdriver

コード
https://github.com/suecideTech/sample-codes/tree/master/go-gcp-logging/zapLogging

出力
“” 2020-07-04 19.38.33.jpg

ちなみにzapdriverはちゃんとReportedErrorEventでErrorReporting報告をしているみたいです。

所感

クラウドではログ管理や解析ツールが揃っているので...
何も考えずにただの文字列を出力しちゃうよりは、早い段階でログ設計をして構造化したログを出したほうがいいのかなと感じました。

参考にした記事

https://future-architect.github.io/articles/20200205/
https://note.com/_yoshioka/n/n513cbf9fd5ad
https://k11i.biz/blog/2018/10/03/stackdriver-logging-friendly-layout-java/

3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7