たごもりすメモ

コードとかその他の話とか。

#fluentd fluent-plugin-file-alternative released!

fluentd 標準のファイル出力プラグイン out_file はメッセージをJSONシリアライズして出力するというもので、これはこれでまあいいんだけど、JSONだと逆に扱いづらいケースなんかもUNIXの文化ではあれこれある。また完全にJSONというわけでもなく、行頭にタブ区切りで日時とタグが入ってたりもするため、いきなり JSON parser にかけるわけにもいかなかったりして面倒だだだ。

ということで、出力フォーマットをさまざまにいじれるようにしたプラグイン out_file_alternative を作り fluent-plugin-file-alternative としてリリースしました。

fluent-plugin-file-alternative | RubyGems.org | your community gem host
tagomoris/fluent-plugin-file-alternative · GitHub

特徴

まず out_file と完全な互換性があり、out_file 用の設定を食わせれば out_file と同じように動作します。全く変更していない out_file 用のテストをパスします。gzip圧縮機能などについても同様にサポートしています。

追加機能としては以下のようなものがあります。

  • path に %Y %m %d %H %M %S といった日時指定用パラメータを直接埋めることができます
    • このように指定した場合、対応するように time_slice_format が自動的に内部でセットされるため、設定で指定する必要はありません
    • 出力時にはパラメータに実際の日時が埋まったファイル名で出力されます
  • 出力行にタグ・日時を入れないよう指定が可能です
  • 出力データをJSON形式、特定の1フィールドのみ、指定の複数フィールド、から選べます
    • またセパレータをタブ以外にスペース、カンマから選択できます
  • データ出力末尾に改行を足す・足さないが選択できます
    • フィールド選択してファイルに書いた場合、そのデータが改行を末尾に持っているならプラグイン側では余計な改行を足さない、ということが可能です

というかんじでだいぶ高機能なので、ファイルに書く、という点においてだいたい問題ないんじゃないかなーと思う。

応用

ということで、このプラグインを使い、以下のような設定を書いた上で fluent-agent-lite を使って各サーバからこの fluentd にログを送ってやると、まさに「ログを集約して一箇所で書く」が簡単にできるわけですよ!!!!


  type forward


  type file_alternative
  path /var/log/service/log.%Y%m%d-%H%M.log
  output_include_time false
  output_include_tag false
  output_data_type attr:message
  add_newline true

fluent-agent-lite から投げるときのタグを適当に調節して、書き出し側の match 節をそれにあわせて準備すれば、ディレクトリごとの書き出しも万全ですね。

便利だとおもいます! お使いください!