tagから出力先ディレクトリを制御するout_tag_fileというfluentプラグインを作った

taka84u9/fluent-plugin-tagfile · GitHub

fluentの組み込みのout_fileプラグインを拡張してout_tag_fileというプラグインを作りました。

インストール

gem install fluent-plugin-tagfile

何故作ったか、out_fileの何が不満だったか

out_fileは次のように設定すると

<match apache.**>
  type file
  path /var/log/fluent/apache
</match>

apacheで始まるあらゆるeventsをひとまとめにして次のようなログファイルを出力します。

/var/log/fluent/apache.20120201.aseoiwaefjpa.log

ここで、例えばapache.accessとapache.errorを送った場合、ここで出力されたファイルは両方を含んでいます。
もし、二つ別々のファイルにしたければ、各行のtagを見て分離する必要があります。

次のように二つのmatchを書くことで、fluentに別々のファイルに出力させることができます。

<match apache.access.**>
  type file
  path /var/log/fluent/apache/access
</match>
<match apache.error.**>
  type file
  path /var/log/fluent/apache/error
</match>

が、もしもっともっとtagの種類が増えたら?
増える度に設定を増やすのは面倒くさい!

out_tag_fileがすること

out_tag_fileはtagの.(ドット)をディレクトリに見立てて、出力先ディレクトリを決定します。例えば次のように設定したとします。

<match prefix.**>
  type tag_file
  path /var/log/fluent
  time_slice_format %Y/%m/%d/%H
  flush_interval 60s
</match>

その上でprefix.foo.barというtagで送られたデータは

/var/log/fluent/foo/bar/YYYY/MM/DD/HH/0.log

に保存されます。YYYY/MM/DD/HHは送られたデータの時間です。
これにより、例えばprefix.SERVICE_NAME.ROLE_NAMEという風にtag付けして送信することで、サービス単位などで簡単にログをディレクトリ分けして格納することができます。