fluentdで始めるログ管理【基本編】


eXcale開発チームの泉谷です。
今回はログ管理でデファクトスタンダードになりつつあるfluentdについて紹介します。
eXcaleでも数百台のサーバのログの管理にfluentdを利用しています。
本記事では、そんなfluentdの基本となる使い方について解説します。

>>eXcaleは期間限定でサインアップキャンペーン実施中!気になる内容はこちら<<


fluentdとは

fluentdはRuby(一部はC)で書かれているオープンソースのログ収集ツールです。
最初のバージョンがリリースが2011年という比較的新しいツールですが、200を超えるプラグインがあり広く使われています。

本記事公開時点の最新バージョンはv0.10.43です。

公式サイト
http://fluentd.org/

ソースリポジトリ
https://github.com/fluent/fluentd


基本的な使い方

インストール方法は色々用意されていますが、今回はgemを使います。
以下のコマンドを実行します。

下記コマンドを実行してバージョンが表示されればインストールは完了しています。

表示されない場合はgem installが成功しているか?PATHが通っているか?等を確認してください。

実行時は以下のようにします。

デーモンとして起動する際は別途オプションが必要です。
起動オプションに付いてはヘルプを参照してください。


基本的な設定

fluentdの設定は、インプットの内容をsourceディレクティブ、アウトプットの内容をmatchディレクティブに記載する形を取ります。

今回はfluentdの基本的な動作を見るために、あるファイルからあるファイルへログを転送してみます。
以下がその設定です。

この例では/var/log/messagesがインプットで、/var/log/tmp.%Y%m%d_x.logがアウトプットです。

インプットの部分(sourceディレクティブ)
インプットはsourceディレクティブに記載します。
1つの設定ファイルに複数のsourceディレクティブを記載することも可能です。

* type
インプットのタイプを指定します。
httpや、コマンド実行結果を受け取るexecなども指定できますが、ログ収集の目的ではtailを指定しましょう。
動作はunixコマンドの”tail -f”のイメージです。

* path
tailするファイルのパスを指定します。

* format
入力とするログのフォーマットを指定します。
この例ではsyslogフォーマットを使用しています。
syslogをはじめapacheやnginxなどよく使われるフォーマットについては用意されているものを使用可能です。
用意されているフォーマットの種類についてはこちらを参照してください。
また、formatの値に正規表現(ex. /(?log).*/ )を指定することで、独自の取得ルールを設定することも可能です。

※注意 fluentdではこのformatに指定する値が用意されている物であれ自分で決めた物であれformatに当てはまらない行は無視されます。(デバッグモードで起動した場合は、fluentdのログに無視した旨が出力されます)

* pos_file
ファイルの中でどこまでtailしたかを記録するファイルです。
pos_fileはfluentd起動時に自動で作られますが、作成するパスに書き込み権限がないと作成に失敗しfluentdが起動できないので注意が必要です。

* tag
インプットにタグを付けます。
アウトプットで使います。

アウトプットの部分(matchディレクティブ)

matchディレクティブは指定したタグ名(この例ではmessages)に該当するインプットに対して処理を行います。

* type
アウトプットのタイプを指定します。
今回はファイル出力なのでfileを指定します。

* path
アウトプットするファイルのパスを指定します。
「ここで指定したパス . time_slice_format(下記) .log」
というファイルがアウトプット対象となります。
ファイルがなければ自動で作成されますが、パスに書き込み権限がないと作成に失敗してバッファのフラッシュに失敗します。

* time_slice_format
ファイル名に付与される時刻のフォーマットを指定します。

* time_format
アウトプットのファイルに書き込まれる時刻のフォーマットを指定します。

バッファリングの部分(matchディレクティブ内)
バッファリングはmatchディレクティブの中でmatchディレクティブごとに設定がします。

* buffer_type
バッファのタイプを指定します。
ここではmemoryかfileが指定可能です。通常はmemoryで良いと思います。

* buffer_chunk_limit、buffer_queue_limit
バッファのチャンクのサイズとリミットを指定します。
今回指定している値はデフォルト値です。

* flush_interval
バッファをフラッシュするインターバルを指定します。
単位はs(秒)、m(分)、h(時)が指定可能です。

* retry_wait、retry_limit
バッファのフラッシュが失敗した際のリトライ間隔、回数を指定します。
buffer_typeをmemoryに設定しているときにリトライ回数を超えて失敗した場合、データが破棄されます。

アウトプットの内容について

fluentdでは出力がjsonになります。
実際に上記の例で出力されたファイルの中を見てみると、1行が以下のようになっていると思います。

ここでjsonの前についているのはmatchディレクティブで指定したtime_formatと、sourceディレクティブで指定したタグ名です。

基本的なfluentdの使い方は以上となります。


便利なプラグイン

fluentdは応用して色々な使い方ができます。
その際に役に立つであろうプラグインを簡単に紹介します。

* copy
インプットを複製してアウトプットを分岐します。

同じログに対して、アーカイブへの転送と解析用DB、もしくはログ解析サービスへの転送を同時にしたい!といったニーズに応えるプラグインです。

* record-modifier
出力を編集し、属性を追加できます。

key、valueがそのままjsonに追加されます。
eXcaleでは「host ${hostname}」などとして、複数のサーバーから1つのサーバーにログ転送した際にどのサーバーが送ってきたログかわかるようにしています。

* mongo
アウトプットとしてMongoDBを使うためのプラグインです。
以下が設定例です。

fluentdには、このmongoプラグインのようにアウトプットの対象を選択するプラグインが多数あります。
例えばAmazon Web ServicesのS3など、ぱっと思いつくものであればプラグインが存在すると思います。
対応しているプラグインは公式のプラグインのリストを参照してみてください。


最後に

このようにfluentdは簡単にログの収集を行うことができます。
次回は、ログを他のサーバーに転送する方法とfluentdを利用したログ運用について紹介したいと思います。