COLOPL Engineers' Blog

2012.05.18

Fluentd tail plugin のお話 (pos_file の指定はお忘れなく)

こんにちは。エンジニアの koji です。

本日(2012/05/18)は Fluentd Casual Talks の日ですね。ものすごく参加したかったんですが完全に乗り遅れてしまったのでご参加された方々のまとめを楽しみにしております。 ということで、その日を記念して Fluentd の tail plugin についてご紹介してみようかなと思います。

すでに稼動しているアプリケーションに Fluentd を導入したい場合、最も Casual に適用できるものとして tail plugin があります(と思っています)。 元々出力しているログを収集して任意の JSON フォーマットにも変換してくれるので、アプリケーションに手を入れることなく適用できてしまうすぐれものですよね(収集もそうですが、JSON に変換するといった点も非常に意味がありますよね)。

公式ドキュメント の方でまだ記述されていない点として、tail plugin には pos_file オプションといったものが指定できます。指定していない場合は以下の warning が出力されます。

2012-05-18 14:40:05 +0900: 'pos_file PATH' parameter is not set to a 'tail' source.
2012-05-18 14:40:05 +0900: this parameter is highly recommended to save the position to resume tailing.

pos_file は指定したファイルに読み込んだ位置を記録しておくことで、たとえば fluentd daemon を再起動したい場合などの場面でその続きから再開して読み込んでくれる機能を提供します。

たとえば、Apache のアクセスログを指定する場合の設定例は以下のようになります。


  type tail
  path /var/log/httpd/access.log
  pos_file /var/lib/fluent/access.pos
  tag apache.access
  format apache
     :

ソースコード にある PositionFile, PositionEntry インナークラスがその役割を担っており、path で指定したログファイルと読み込んだ位置(IO#seek で指定する位置)とログファイルの inode を記録して、fluentd 起動時にその内容を参照してその続きから再開するといった内容になっております。

また、pos_file オプションとは異なりますが logrotate 等によりログが切りかわったことも検知することもできます。先に挙げたソースコード内にある RotateHandler インナークラスがその役割を担っており、path で指定したログファイルの inode もしくはファイルサイズが変化した場合その変更を検知することで実現しております。

1 つ注意点としては、logrotate する前に fluentd が落ちてしまい、そのまま時が過ぎて logrotate した後に fluentd を再開した場合は pos_file で記録されている内容からは再開することは現状できません。そういう側面においては監視等で工面して必要があります。

tail plugin はかなり頻繁に変更されているので、Github を watch して情報共有していきましょう。