fluentdでログの欠損に悩んでいたらread_from_headで解決したパターンをメモ。
(fluentdの設定はわりとうろ覚えです)
ユーザーの行動ログを以下の様なフォーマットで保存していた。
log-2016-02-01-00.log
log-2016-02-01-01.log
...
log-2016-02-01-22.log
log-2016-02-01-23.log
log-2016-02-02-00.log
ようするに、1時間あたり1ファイルができるようにしていた。
これをfluentdのin_tailプラグインで以下のように読んでいた。
<source>
type tail
path /path/to/log/log-%Y-%m-%d-%H.log
... 以下略
</source>
こんな日付指定でログを読んでくれて、新しいファイルが生成されると読み始めたとinfo出してくれるので、fluentdは賢いなと喜んでいた。
この先にElasticsearch + Kibanaの環境があるのだが、そちらで見た時のログの数とログファイルを直接wc -l
したときの数が一致しない。だいたいどのhourも1.3%ぐらいログが欠損してて、困った。
いろいろ探した結果、read_from_head
というディレクティブがあることを発見。
tail Input Plugin | Fluentd
http://docs.fluentd.org/articles/in_tail
デフォルトはfalseなので、もしやと思ってtrueにしたら、見事ログの欠損がなくなった。
<source>
type tail
path /path/to/log/log-%Y-%m-%d-%H.log
read_from_head true
... 以下略
</source>
どういうこと
次のファイルが生成された際に、そのファイルを読み始めるのに若干のギャップがあって、デフォルトの動作だと新しいファイルの末尾から読み始めるから、読み始めるまでのログの部分が欠損していたみたい。
末尾から読み始めるデフォルト動作は、ログの出力先が常にerror.log
で、定期的にerror.log-20160202
などにmvして新しくerror.logを作るrotate動作が一般的だからかなと。
fluentdさんはバッファリングがとても優秀でほんと助かる。ちょっと再起動したいぐらいのダウンタイムなら全く問題ないので、気を使わなくてすみます。