ElasticsearchのログをGKEでStackdriverで取り込む

GKEとかで普通にElasticsearchを使って、コンソールのログをStackdriverで回収してもらえば、Logs Viewerで見ることができると思うけど、ログレベルがINFOかERRORの2択になる。つまり、WARNとかのログはINFOとして出てしまう。これはStackdriverに投げているfluentdがログメッセージのパースができなければ、stdoutならINFOで、stderrならERRORみたいな決め方になっているためで、fluentd-configmap.yamlあたりをみればわかる。

それではどうするか?だけど、fluentd-configmap.yamlには

format /^(?<severity>\w)(?<time>\d{4} [^\s]*)\s+(?<pid>\d+)\s+(?<source>[^ \]]+)\] (?<log>.*)/

という感じでパースするフォーマットが書いてあるのでこれに合わせる必要がある。<time>\d{4}って、何を指しているのだろうとかも思ったけど、MMddだった。

Elasticsearchのでデフォルトのログフォーマットとかはlog4j2.propertiesを見ると

appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %m%n

という感じになっていると思うけど、この辺のログフォーマットを

appender.console.layout.pattern = %.-1p%d{MMdd HH:mm:ss.SSSSSS} 1 [%node_name] %m%xThrowable{separator(|)}%n

みたいな感じで、patternたちを変更しておく。ログレベルが始めの1文字で表されている。pidはとりあえず適当に1とかにしたけど、きちんと取得してもよいのかも(試してない)。あとは、スタックトレースが1行内に収めないと、Stackdriver上で分解されれるので1行にしておく。

これも普通にぐぐると、エージェントを組み込むとか、GKEのfluentdの設定をカスタマイズするとかがほとんどな気がするので、このログフォーマット問題は結構ハマる気がする…。

コメントを残す

メールアドレスが公開されることはありません。