GCP(Google Cloud Platform)のGKE(Google Kubernetes Engine)上で動くアプリにて、標準出力へ「{"message":"test!","level":"warn"}
」というJSON形式のログを出力すると・・・Cloud Loggingのログエントリーのseverityには、levelで指定した値がコピーされます。つまり「{"message":"test!","severity":"warn"}
」と出力した時と同じ動作になってくれるのです!!!
誰が値をコピーしてくれてるの?
GEK上で出力したログは、fluentbit-gke
というDaemonSet経由でCloud Loggingへ連携されており、Fluent BitがCloud Loggingへ連携する前に値をコピーしてくれています。
具体的にはどんな設定が入っているの?
Fluent Bitの設定は、fluentbit-gke-config-v{バージョン番号}
というConfigMapに定義されており、severityが指定されていない場合は、levelの値をコピーするという定義がされていました。
# ...
# level is a common synonym for severity,
# the default field name in libraries such as GoLang's zap.
# populate severity with level, if severity does not exist.
[FILTER]
Name modify
Match kube_*
Copy level severity
# ...
なぜこんなことを調べたのか?
現在参画しているプロジェクトでは、オンプレ環境で動いているアプリのログもCloud Loggingへ連携しているのですが、オンプレから連携されたログについては、Cloud Loggingのseverityが未指定(=デフォルト扱い)になっていて・・・なぜだ〜となって調べてみました。
オンプレ環境のログどうしよ〜
オンプレのログ収集基盤がどうなっているのか全くわかっていないのですが・・・
- オンプレのログ収集基盤側でGKEと同じように値をコピーしてから連携してもらう
- アプリで出力するログのログレベルの項目をseverityに変える
の2択だと思いますが、アプリ屋としてはログ収集基盤側で対応してくれると嬉しいな〜と思ってますw