Fluentdの概要
Fluentdは、「Log everything in JSON」を掲げ、すべてのログをJSONとして扱うことを目的として開発されたログコレクターデーモンです。さまざまなログ元からログをインプットとして収集し、アウトプット先にJSON形式に変換したものを各種データストアに渡します。
Fluentdの出力形式について
Fluentdは、インプットされたログを「タグ」と「日時」と「レコード」の3つから構成される形式に変換します。リスト1は、nginxのログをFluentdにインプットし、テキストファイルにアウトプットしたログです。リスト1を見ると、時間とタグが冒頭にあり、その後にJSON形式のKey-Valueがレコードとして続いていることが分かります。Fluentdに投入されたログは、いったん必ずリスト1のような形式に変換されます。
2012-09-11T10:01:03+09:00 nginx.access {"host":"10.10.0.1","user":"-","method":"GET","path":"/test/test.aspx?sid=15","code":"200","size":"14835""agent":"DoCoMo/2.0","response_time":"0.157"}
Fluentdのプラグイン
Fluentdの機能は、インプットとアウトプットとバッファリングの3種類に分かれています。図3のように、Fluentdへのインプットとアウトプットはすべてプラグインで構成されています。
デフォルトでもいくつかのプラグインが同梱されていますが、プラグインを追加することでさらに機能拡張できます。すでに多くのプラグインが有志によって開発され公開されています。また、Rubyを使用して既存のプラグインを改造したり、新規プラグインを開発することができます。他言語のスクリプトを呼び出すためのプラグインも公開されていますので、使用するとRuby以外の言語でも機能拡張ができるようになっています。
プラグイン種別 | プラグイン名 | 説明 |
---|---|---|
Input プラグイン |
in_forward |
TCPソケットで、他のFluentdインスタンスから イベントログを受けるのに最もよく使用されるプラグイン |
in_http | HTTP Postでレコードを受け取るプラグイン | |
in_tail |
テキストファイルの末尾からイベントログを 読み取るプラグイン |
|
in_exec |
外部ブログラムを実行してイベントログを受信したり pullするプラグイン |
|
in_syslog |
UDP上でsyslogプロトコル経由で レコードを受け取るプラグイン |
|
in_scribe |
Scribeプロトコルからレコードを受け取るプラグイン。 ScribeはFacebookがオープンソースで提供する ログ収集デーモン。 |
|
Output プラグイン |
out_file | ファイルにイベントログを書きだすプラグイン |
out_forward | 他のFluentdインスタンスにイベントログを転送するプラグイン | |
out_exec | 外部プログラムにタブ区切りでイベントログを受け渡すプラグイン | |
out_exec_filter |
タブ区切りのイベントログを外部プログラムに渡し、 外部プログラムから新しいイベントログを読み込むプラグイン |
|
out_copy | イベントログを複数のアウトプットプラグインに渡すプラグイン | |
out_roundrobin |
ラウンドロビンアルゴリズムを使用して、 複数のアウトプットにイベントログを分散させるプラグイン |
|
out_stdout | stdoutにイベントログをプリントするプラグイン | |
out_null | ログを捨てるプラグイン | |
out_s3 |
Amazon S3クラウドオブジェクトストレージサービスに イベントログを書き込むプラグイン |
|
out_mongo | MongoDBにイベントログを書き込むプラグイン | |
out_mongo_replset |
ReplicaSetを使用しているユーザー用のMongoDBに イベントログを書き込むプラグイン |
|
out_webhdfs |
HDFS (Hadoop Distributed File System)に イベントログを書き込むプラグイン |
Fluentdの導入
Fluentdは簡単に導入することができます。既存のシステム構成やアプリケーションの修正をしなくても導入できるようになっているため、試験的に導入してみることも可能です。
Fluentdのインストール
今回は、CentOS 5.8でRuby 1.9を使用できる環境を前提として説明します。Fluentdのステーブルパッケージとして、Treasure Data社が管理するtd-agentが提供されています。通常はtd-agentを使用してFluentdを導入するのが一番簡単な導入方法です。
[1]yumにtd-agentの設定を追加する
yumでインストールするために、td-agent用のyum設定ファイルを/etc/yum.repos.d/td.repoに作成します。td.repoには、リスト2を書き込み保存します。
[treasuredata] name=TreasureData baseurl=http://packages.treasure-data.com/redhat/$basearch gpgcheck=0
[2]yumでtd-agentをインストールする
td-agentのパッケージ情報を反映させるため、yumを更新し、td-agentをインストールします。
# yum install td-agent
Fluentd(td-agnet)の起動・停止・再起動
td-agentをインストールが完了すると、/etc/init.d/td-agentのスクリプトが配置されているます。このスクリプトを使用するとtd-agentを起動・停止・再起動することができます(リスト4)。
# /etc/init.d/td-agent start # /etc/init.d/td-agent stop # /etc/init.d/td-agent restart
Fluentd(td-agnet)自体のログの参照
td-agent自体のログは、/var/log/td-agent/td-agent.logに出力されるので、td-agentを起動したり、設定ファイルを修正し再起動したりした後には、ログを確認して正常に起動しているかどうかを確認してください。
td-agentの設定ファイルは、/etc/td-agent/td-agent.confに作成されています。デフォルトでサンプル設定が記載されていますので、必要に応じて修正してください。設定ファイルの変更を反映させるためには、td-agentを再起動させる必要があります。今のところ、設定ファイルのチェック機能は提供されていないので、修正しtd-agentを再起動した後は、/var/log/td-agent/td-agent.logを確認してエラーが出ていないか、設定が読み込まれているかを確認してください。
td-agent.logには、プロセスの起動や停止、設定ファイルの読み込み、設定ファイルのロード状況などが記載されます。
リスト5は、td-agentの起動と、読み込んだ設定ファイルのパス、追加したプラグインについて出力されています。
2012-09-11 17:04:50 +0900: starting fluentd-0.10.25 2012-09-11 17:04:50 +0900: reading config file path="/etc/td-agent/td-agent.conf" 2012-09-11 17:04:50 +0900: adding source type="forward" 2012-09-17 21:01:14 +0900: adding source type="tail"
リスト6は、設定ファイルの記述ミスで使用されなかったパラメータについて出力された例です。「is not used.」のような出力がある場合は、設定ファイルの記述ミスの可能性があるので、設定ファイルを見直すようにしてください。
2012-09-11 17:04:50 +0900: parameter 'type' in <match nginx.access> type file path /var/log/fluentd/access_log </match> is not used.
詳細は後述しますが、Fluentdの出力はタグを使用して制御されます。プラグインを使用する場合は、タグを指定します。しかし、Fluentdの出力のタグにマッチする設定が記載されていない場合は、リスト7のようなエラーが出力されます。この場合は、設定漏れの可能性が高いので、設定ファイルやログ活用フローを見直す必要があります。
2012-09-11 18:01:01 +0900: no patterns matched tag="debug.test"