fluentdを使ってみる機会があったのでメモ
fluentdとは
Fluentdは、ログを収集し格納するためのログ収集基盤ソフトウェアです。Fluentdにインプットされた、すべてのログをJSONに変換し、アウトプットします。インプットとアウトプットはモジュール化されており、モジュールを追加することでインプット元とアウトプット先を追加できるようになっています。
とりあえずのテストでやりたいこと
fluentdを使って、
アプリケーション(phpなど)からjson形式で吐き出したファイル
(apacheのaccess_logのようにファイル名に日付形式を含む)
をリアルタイムに違うファイルに吐き出す。
本当は別サーバに構築したmongodbにforwardしてつっこみたいが今回はやらない。
ではさっそく。。。
rubyとfluentdインストール
rubyインストール
rubyを任意の場所にインストールするのはこちらでやってみました
→任意のディレクトリにrubyとgemをインストール
2.x系にはgemは内包されてるようなのでrubyのみインストールです。
※環境変数の設定くらいはしておきましょう
ディレクトリイメージ
# pwd /home/hoge # tree . `-- local ←①rubyインストールでできたディレクトリ
fluentdインストール
gemでfluentdインストール
# pwd /home/hoge # gem install fluentd --no-ri --no-rdoc ※設定ファイル作るディレクトリを作る # mkdir fluentd # fluentd --setup ./fluentd/fluent ←fluent.confという設定ファイルが作られます # tree . |-- fluentd ←②mkdirで作った | `-- fluent ←③fluentd設定するとき指定した | `-- fluent.conf `-- local ←①rubyインストールでできたディレクトリ
とりあえず起動&停止テスト
※設定ファイルを指定して起動 # fluentd -c ./fluentd/fluent/fluent.conf -vv & ※pidを指定して停止 # ps aux | grep fluent hoge 10345 0.0 0.0 107452 916 pts/2 S+ 23:18 0:00 grep fluent hoge 21753 0.0 0.8 200644 17052 pts/0 SNl 21:52 0:00 /home/hoge/local/bin/ruby /home/hoge/local/bin/fluentd -c ./fluent/fluent_json.conf -vv hoge 21755 0.0 1.2 353396 23404 pts/0 SNl 21:52 0:01 /home/hoge/local/bin/ruby /home/hoge/local/bin/fluentd -c ./fluent/fluent_json.conf -vv # kill -9 21753 21755
設定&起動確認−その1(標準入力→標準出力ぱーたん)
「標準入力→標準出力」のパターンでテストしてみます
デフォルトで作られたfluent.confを読み込んでのテストです。
こちらを参考にしました
→fluentdの簡単な使い方、設定方法一覧
起動
※設定ファイルを指定して起動 # fluentd -c ./fluentd/fluent/fluent.conf -vv & [1] 10810 2013-12-02 15:23:49 +0900 [info]: fluent/supervisor.rb:169:supervise: starting fluentd-0.10.40 2013-12-02 15:23:49 +0900 [info]: fluent/supervisor.rb:271:read_config: reading config file path="./fluentd/fluent/fluent.conf" 2013-12-02 15:23:49 +0900 [trace]: fluent/plugin.rb:87:register_impl: registered buffer plugin 'file' ・・・省略・・・ <source> type forward </source> <source> type http port 8888 </source> <source> ・・・省略・・・
確認
# echo '{"json":"message aiueo"}' | fluent-cat debug.test 2013-12-02 15:29:24 +0900 [trace]: plugin/in_forward.rb:152:initialize: accepted fluent socket object_id=70259900007160 2013-12-02 15:29:24 +0900 debug.test: {"json":"message dayo"} 2013-12-02 15:29:24 +0900 [trace]: plugin/in_forward.rb:193:on_close: closed fluent socket object_id=70259900007160
設定&起動確認−その2(ファイル→ファイルぱたーん)
アプリケーション(php)とかからjson形式で吐き出したファイルを想定して
fluentdでリアルタイムに別ファイルに吐き出してみます
アプリケーションで吐き出す想定のlogファイル(fluentdのinput)、fluentが吐き出す想定のlogディレクトリ(fluentdのoutput)を作る
アプリケーションで吐き出すログ(fluentdのinput)は、
日付がファイル名に入っている想定なのでとりあえずで「log.2013-11-28」とかにしておきます。
また、設定内容は後述しますが、fluentdの設定では指定するファイルを固定したいので
ポイントとしてはシンボリックリンクを使って日付入りのファイルを固定します。
こちらを参考にしました
→Zabbixで日付付きのログファイルを監視する場合のちょっとしたコツ
# pwd /home/hoge ※fluentdのinput用ファイルのディレクトリ # mkdir ./fluentd/input_log # touch ./fluentd/input_log/log.2013-11-28 ※fluentdのinput用ファイルを固定する # ln -nfs /home/hoge/fluentd/input_log/log.`date "+%Y-%m-%d"` /home/hoge/fluentd/input_log/log # ls -l lrwxrwxrwx 1 hoge hoge 44 11月 29 21:48 2013 log -> /home/hoge/fluentd/input_log/log.2013-11-28 -rw-r--r-- 1 hoge hoge 4040 11月 29 23:17 2013 log.2013-11-2 ※fluentdのoutput用 # mkdir -p ./var/log/fluent
※参考にさせて頂いた記事にも記載がありますが、新しい日付入りファイルが作成されても勝手に追ってくれるわけではないので
※ログの切替はcronなどで対応が必要です
設定ファイル作る
・sourceディレクティブはtype=tail、format=jsonを指定
・sourceディレクティブのtagはjson.testを指定、matchディレクティブにもjson.testを指定
・matchディレクティブには吐き出すファイルを指定
# vi ./fluentd/fluent/fluent_json.conf --viでファイル作成-- ## Json input ## read json logs with tag=json.test <source> type tail format json path /home/hoge/fluentd/input_log/log tag json.test </source> ## match tag=json.test and write to file <match json.test> type file path /home/hoge/var/log/fluent/output_json_log time_slice_format %Y%m%d%H%M time_slice_wait 10s </match> --------------------
matchディレクティブのtime_slice_formatやtime_slice_waitについては後述の補足で説明します
ここまでのディレクトリイメージ
# pwd /home/hoge # tree . |-- fluentd ←②mkdirで作った | |-- fluent ←③fluentd設定するとき指定した | | |-- fluent.conf | | `-- fluent_json.conf ←⑥新しく作った設定ファイル | | | `-- input_log ←④input用にmkdirした | |-- log -> /home/hoge/fluentd/input_log/log.2013-11-28 ←④´inputの設定用に固定にした | `-- log.2013-11-28 | |-- local ←①rubyインストールでできたディレクトリ | `-- var `-- log `-- fluent ←⑤output用にmkdirした
起動
# pwd /home/hoge # fluentd -c ./fluentd/fluent/fluent_json.conf -vv & [1] 15724 2013-11-28 17:56:24 +0900 [info]: fluent/supervisor.rb:169:supervise: starting fluentd-0.10.40 2013-11-28 17:56:24 +0900 [info]: fluent/supervisor.rb:271:read_config: reading config file path="./fluentd/fluent/fluent_json.conf" ・・・省略・・・ 2013-12-02 17:56:25 +0900 [info]: fluent/engine.rb:89:configure: using configuration file: <ROOT> <source> type tail format json path /home/hoge/fluentd/input_log/log tag json.test </source> <match json.test> type file path /home/hoge/var/log/fluent/output_json_log </match> </ROOT> 2013-12-02 17:56:25 +0900 [info]: fluent/engine.rb:99:block in configure: adding source type="tail"
確認
input用のログファイル(phpとかで吐き出される想定)に
echoとリダイレクト直接書き出してみます
# echo '{"json":"message dayo", "date":"'`date "+%Y-%m-%dT%T"`'"}' >> ./fluentd/input_log/log # echo '{"json":"message dayo", "date":"'`date "+%Y-%m-%dT%T"`'"}' >> ./fluentd/input_log/log # echo '{"json":"message dayo", "date":"'`date "+%Y-%m-%dT%T"`'"}' >> ./fluentd/input_log/log
output用のログファイルを確認してみます
# pwd /home/hoge/var/log/fluent # ls -l -rw-r--r-- 1 hoge hoge 356 11月 28 18:28 2013 output_json_log.201311281828.b4ec89cd0b56b0236 -rw-r--r-- 1 hoge hoge 89 11月 28 18:29 2013 output_json_log.201311281829.b4ec89cf8c3bd463c # less output_json_log.201311281828.b4ec89cd0b56b0236 2013-11-28T18:28:21+09:00 json.test {"json":"message dayo","date":"2013-11-28T18:28:21"} 2013-11-28T18:28:28+09:00 json.test {"json":"message dayo","date":"2013-11-28T18:28:27"} 2013-11-28T18:28:28+09:00 json.test {"json":"message dayo","date":"2013-11-28T18:28:28"}
無事できました!
補足
fluentdのmatchディレクティブに指定したログファイル名ですが
output_json_log.201311281828.b4ec89cd0b56b0236
のように後ろに変な文字列がついてるかと思います。
これは、
time_slice_formatで指定した日時(分秒)のログファイルができたあと
time_slice_waitで指定した分(秒)後にバッファがフラッシュされて
output_json_log.201312021828_0.log
というログファイル名に書き換わります。
上記の確認項目の後、2〜3分後にもっかいlsするとこんな感じになってます
# ls -l -rw-r--r-- 1 hoge hoge 356 11月 28 18:29 2013 output_json_log.201311281828_0.log -rw-r--r-- 1 hoge hoge 89 11月 28 18:30 2013 output_json_log.201311281829_0.log
また、「_0」という値ですが、バッファのチャンクの上限値単位で割り振られる値らしいです。
簡単に補足しましたが、詳しくはこちらを参考にさせて頂きました!
→fluentdのout fileプラグインの仕様について