いまさら fluentd v1 をはじめてみた、その1
いまさら fluentd v1 はじめてみる
「fluentd + Kibana + elasticsearch」 やら 「fluentd + MongoDB」とログ解析してDBに入れつつグラフ化しちゃうなんて巷で流行っているな~~と指をくわえてみてたんです。そして1年経過・・・そろそろやらねば!と重い腰をあげてみました。そしてまたハマったw
※fluentd v2がでております~
fluentd って
システム構築したことある人なら経験があるように各システムに散らばったログを収集&解析、グラフ化するのって簡単そうで結構大変な作業ですよね。fluentd は、ruby で書かれたログ解析ツール(ログ収集管理ツール?)で、このツールを使うことにより簡単に処理できるようになります。
また多彩な入出力プラグインが用意されていますし、こんなのないかな?と思うと別途公開されていたりと殆ど自分で作成する必要がない位に充実しています。
ハマった
マニュアルを嫁、といわれそうですが・・・。fluentd でのin/outはすべて json で処理されるということ。
そのためアプリケーションログに対し入力プラグインに対応していないとだめw。かといっても正規表現を少し勉強すれば対応可能。
とりあえず初心者らしくかる~く実装してみます
「nginx ⇒ fluentd ⇒ MongoDB」の記事が多くヒットするのですが、ここは初心者っぽいとこから実装してみます。構成として以下のような感じ(vm を3つ用意してね)。
あと入力するログ(aa.log/bb.log)は、勉強用のため独自フォーマットにしてみました。
※だって apache やら nginx だとプラグインがあるので・・・
fluentd のインストール
対象のサーバ(送信側、受信側)に fluentd をインストールします。環境によってインストールする手順は違えども基本的に簡単に導入できます。
※shを見るとわかるけけど /etc/yum.repos.d/td.repo にレポジトリを登録します。
$ sudo su
# curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh
送信側の設定
/tmp/aa.log に行が追加されたイベントで td-agent が動作し、ログ収集サーバに http でデータを転送する設定を行います(/tmp/bb.log も同じ)。
<source>
type tail
path /tmp/aa.log
pos_file /tmp/access.pos
format /^(?<date>[^\]]*) (?<host>[^ ]*)$/
time_format %d/%b/%Y:%H:%M:%S
tag test.access
</source>
<match test.access>
type forward
buffer_chunk_limit 256m
buffer_queue_limit 128
flush_interval 5s
<server>
host 192.168.11.106
port 24224
</server>
</match>
ここで特筆すべき点は、sourceディレクティブ の 「format」です。正規表現で指定しますが特殊な記述の方法なので独自ログを解析しようと思った場合は少し手間がかかるので、Fluentular サイトで試行錯誤しながら作成するのが楽チンです。
受信側の設定
データを http で受信し /var/log/td_log/td_access に結果を出力する設定を行います。
<source>
type forward
port 24224
</source>
<match test.access>
type file
time_slice_format %Y%m%d_%H%M
time_slice_wait 1m
path /var/log/td_log/td_access
time_format %Y%m%dT%H%M%S%z
</match>
type file プラグインが更新されているのか、ググと上記の設定で td_access.log ができるお!と書いてあるけど実際には「 td_access.log + time_slice_format + _0.log」で出力されます。
また td__access.20140622_1413.b4fc65c8fe4bf524b 形式のファイル名になってしまうのは、fluentd がログデータを確定する前段階のファイルとして一時ファイルを作成するからです(time_slice_format の形式でまとまるらしい)。
テスト方法
fluentd が動作して状態をみることによりイベントの流れが判ると思うので最初は、td-agent -vv
コマンドを送受信側で起動しいたほうがよい。構文エラーの場合も起動せず止まるので原因が追究しやすい。
$ sudo td-agent -vv
送信側
$ echo "22/Jun/2014:09:14:05 aaaa" >> /tmp/aa.log # ログとして有効なことを確認
$ echo "22/Jun/2014:09:14:05 aaaa ddd fff" >> /tmp/aa.log # ログとして無効なことを確認
さて運用してみるか
実際にサービスとして起動してみます。 が ログが出力されない状態になるかもしれません。
しかもサービスを起動しても [OK] って表示されれている・・・。
そんなときは、fluentd の起動ログ /var/log/td-agent/td-agent.log を見ましょう。ここにすべてが書いてあるw
※td-agent ユーザで td-agent を起動するので 「:EACCES: Permission denied」になってるときもある。
# /etc/init.d/td-agent restart
Starting td-agent: [ OK ]
次は
ltsv プラグンを使った方法を勉強してみる(その2)の予定ですw
参考サイト
td-agent(fluentd)のposファイルの作成タイミングとかその他もろもろもメモ
【fluentd初心者】td-agentに起動偽装された件について
fluentdの簡単な使い方、設定方法一覧
Discussion