読者です 読者をやめる 読者になる 読者になる

tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

fluentdを任意の場所にインストールして使ってみるテスト

fluentdを使ってみる機会があったのでメモ

fluentdとは

Fluentdは、ログを収集し格納するためのログ収集基盤ソフトウェアです。Fluentdにインプットされた、すべてのログをJSONに変換し、アウトプットします。インプットとアウトプットはモジュール化されており、モジュールを追加することでインプット元とアウトプット先を追加できるようになっています。

Fluentdで始めるリアルタイムでのログ有効活用

とりあえずのテストでやりたいこと

fluentdを使って、
アプリケーション(phpなど)からjson形式で吐き出したファイル
(apacheaccess_logのようにファイル名に日付形式を含む)
をリアルタイムに違うファイルに吐き出す。
本当は別サーバに構築したmongodbにforwardしてつっこみたいが今回はやらない。

ではさっそく。。。

rubyとfluentdインストール

インストールする環境

os

# cat /etc/redhat-release
CentOS release 5.3 (Final)
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プラグインの仕様について