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 は出力されない。

参考