Fluentdをとにかく使ってみる方法

Fluentdは"ログ”を別のサーバーに転送したり、一箇所に集めたり、DBに格納したりといったことが簡単にできるツールです。
Fluentdではログの入力方法と出力方法さえ指定すればデータの転送・バッファリング・エラー処理といったややこしいことは全てFluentdが面倒を見てくれるため、ユーザーは細かいことを気にせず使うことができます。
また、入力と出力の部分はプラグインを自由に書けるようになっているため、非常に拡張性が高いです。

用途としてはWebサーバーやデータベースなどが吐くログを収集することですが、実際にはログってなんでもいけます。
それこそ、テキストに書きだされた全然ログっぽくない文字列を転送するのにも使えます。
なので、ログを持ってなくても普通に使えます。

インストール

gemで入れるのが簡単です。
サービスでちゃんと使いたかったらTreasureDataが提供しているパッケージを使った方が良い気がします。(デーモンとして動作するので)

gemでいれる場合、

$ gem install fluentd

でインストールできます。

そうするとfluentdというコマンドが使えるようになっているはずです。

ファイルからログを読み込み、別のファイルへ出力する例

あるファイルに追加されたログ(といっても適当な文字列)を別のファイルに書き出す例を試してみましょう。

以下のようなFluentdの設定ファイル(fluent.conf)を準備します。

<source>
  type tail # 使うInputプラグイン
  path /home/yk-twww/tmp/log # 監視対象のファイル
  pos_file /tmp/pos_file # ファイルをどこまで読んだかを記録するファイル
  format none # 読み込むログのフォーマット
  tag example # 付与するタグ
</source>

<match example>
  type file # 使うOutputプラグイン
  path /home/yk-twww/tmp/log.sent # 書き出すファイル
</match>

sourceディレクティブは入力をどう受け付けるかを指定します。
typeオプションは使用するInputプラグインを指定します。
この設定の場合だと、in_tailというファイルの末尾に追加された行を読み取るプラグインを使っています。(このプラグインは組み込みのプラグインなので別途インストールする必要はないです。)
Fluentdは読み込んだログに対して、tagオプションで指定されたタグを付与します。
このタグによって出力方法を簡単に振り分けることができます。

matchディレクティブは入力側で受け取ったログをどう出力するかを指定します。
matchの横に書かれているexampleはタグ名でこれは、このタグが付与されたログはこのmatchディレクティブに従って処理するってことを表しています。
この場合もtypeオプションで使用するOutputプラグインを指定します。
この設定の場合だと単純にファイルに書き出すout_fileというプラグインを使っています。(このプラグインも組み込みのプラグインなので別途インストールする必要はないです。)

動かしてみましょう。(-cオプションで使用する設定ファイルを指定しています。)

$ fluentd -c fluent.conf

を実行し、別のターミナルで、

$ echo "hoge" > /home/yk-twww/tmp/log
$ echo "foo" >> /home/yk-twww/tmp/log

などと書き込むと、log.sent.20150517.b5165019fe99e02e8みたいなファイルが/home/yk-twww/tmp以下にできています。
中身は下のようになっています。

2015-05-17T20:14:09-04:00       example {"message":"hoge"}
2015-05-17T20:14:10-04:00       example {"message":"foo"}

ログを読み込んだ時刻、タグ、ログの内容を固めたJSONが順番に並んでいます。

Fluentdは書き出しをバッファしているみたいで、ログが書き出されるタイミングとかファイル名とかは実行環境によって違ってくると思います。
そこら辺の挙動はまだちゃんと把握していません。

また、「log.sentに書き出すようにしたのに、log.sent.20150517.b5165019fe99e02e8みたいな変なファイル名に書きだされてるんだよ」ってツッコミたくなりますが、これは実装上の仕様みたいで、もし、log.sentってファイル名で出力を追いたければ、設定ファイルに

<match example>
  type file
  path /home/yk-twww/tmp/log.sent
  symlink_path /home/yk-twww/tmp/log.sent # <-- 加える
</match>

のようにsymlink_pathオプションを付けるとlog.sentというシンボリックファイルが作られ、このシンボリックリンクから出力を追うことができます。

まとめ

Fluentdは基本的な設定ファイルの書き方を覚えると大体のことはできるようになります。
プラグインも結構簡単に作れたり読めたりするので、プラグインの使い方がわからなかったらソースコードを読んでみるのも勉強になります。