fluentd で go のログを panic 含めて集約する
go で書いたアプリケーションのログを fluentd で集約するとする。
アプリケーション自体のログは fluentd に直接投げるのではなくファイルに書かれていて、普段のログはなにかのフォーマット(例えばここでは json とする)で書かれてる場合このように書く。
<source> type tail tag foo path /path/to/foo.log pos_file /path/to/foo.log.pos format json </source>
しかしこれだと panic してしまった場合その情報は集約出来ない。なので
<source> type tail tag panic pos_file /path/to/panic.log path /path/to/panic.log.pos format multiline format_firstline /(^{\".*\"}$)|(^panic: .*$)/ format1 /^(?<message>panic:.*exit status \d+)$/ </source>
このような設定を別途足すと後者は、最初の行が json か panic だったらそれを基準に、format_firstline にひっかからない限り行をバッファしていき、次に format_firstline にひっかかった時にformat1 の正規表現でマッチングをする。(なので panic の後に再起動して format_firstline にマッチするようなログが出力されないといけない)
format_firstline を指定しないと正規表現にひっかからない限り行をバッファしてしまうので panic という稀な情報を集約したいのに普段出力される json の行をバッファしてしまい非効率である。
上の2つはそれぞれ前者は json 以外、後者は json にマッチしないので "pattern not match" というログが出てしまうのでそれが気になる場合は log_level error
をそれぞれ設定すると warn は出力されない。