タイトルの通り
fluentdのout exec pluginを試してみました。
http://docs.fluentd.org/articles/out_execdocs.fluentd.org
リンクが切れていたので追記です。
docs.fluentd.org
概要
dummerによって作成したltsv形式のlogファイルをtail input pluginで監視して
exec output pluginで何らかの操作をする
ということをします。
dummerなどについては下記の記事を参考にしていただければと・・・
構成
fluentd 0.12.7
$tree . ├── dummer.conf.rb ├── exec.sh ├── fluent.conf
dummer.conf.rb
configure 'sample' do output "dummy.log" rate 500 delimiter "\t" labeled true field :id, type: :integer, countup: true, format: "%04d" field :time, type: :datetime, format: "[%Y-%m-%d %H:%M:%S]", random: false field :uri, type: :string, any: %w[/api/v1/people /api/v1/textdata] end
dummer -c dummer.conf.rb によってこんなログが吐出されます。
$tail -n 2 dummy.log id:36798 time:[2015-05-20 21:15:56] uri:/api/v1/textdata id:36799 time:[2015-05-20 21:15:56] uri:/api/v1/people
fluentd.conf (初期段階)
はじめこんな感じでやりました。
この後matchの方に flush_interval が追加されます。
<source> type tail format ltsv path ./dummy.log tag dummy time_format "[%Y-%m-%d %H:%M:%S]" </source> <match **> type exec command sh ./exec.sh buffer_path ./pos format json </match>
exec.sh (初期段階)
引数に何が来るのだろうと思っていたので、これを試しました。
#!/bin/sh echo $0 >> out echo $@ >> out
検証
iterm2で3画面用意します。
ディレクトリに移動後
- dummer -c dummer.conf.rb
- fluentd -c fluentd.conf
- tail -f out
を実行します。
そしたら長いこと何も表示されませんでした・・・
なんでだろうと思って色々ググってたら下記にたどり着きました。
そこにこう書かれていました。
"「flush_interval」パラメータでは、どのくらいの頻度でコマンドを実行するのか、 時間を指定します。ログが来る度にコマンドを実行していては非効率ですので、 ある程度溜まったところで実行します。時間には「s」「m」「h」をつけます。 (ご想像通り、それぞれ、秒、分、時です。)"
flush_intervalってexecのコマンドをflushするintervalだったのか。
なのでfluentd.confを書き換えます。
fluentd.conf
<source> type tail format ltsv path ./dummy.log tag dummy time_format "[%Y-%m-%d %H:%M:%S]" </source> <match **> type exec command sh ./exec.sh buffer_path ./pos format json flush_interval 1s </match>
これでどうだ。
- dummer -c dummer.conf.rb
- fluentd -c fluentd.conf
- tail -f out
を実行
tailしていたoutファイルに変化がありました。
./pos.20150520.q5168261e2abaa54e.log
./exec.sh
./pos.20150520.q5168262012571269.log
./exec.sh
./pos.20150520.q51682621fa56206b.log
./exec.sh
./pos.20150520.q51682623e28036a2.log
./exec.sh
./pos.20150520.q51682625caa5b704.log
なるほど。
引数にposファイルを渡すのか。
それでflushなんですね。
なので、exec.shを下記のようにしてみました。
exec.sh
#!/bin/sh cat $1
そしたらfluentd -c fluentd.confしている画面にexec.shによる標準出力が現れました。
{"id":"16845","uri":"/api/v1/people"}
{"id":"16846","uri":"/api/v1/people"}
{"id":"16847","uri":"/api/v1/people"}
{"id":"16848","uri":"/api/v1/people"}
{"id":"16849","uri":"/api/v1/textdata"}
こんな感じ
所感
exec plugin使い方がわかりました。
これで以前作ったSlackRTMpluginと合わせてslackの投稿があったら、何かするということがリアルタイムに出来そうです。