fluentd + Elasticsearch + Kibana 
(fluentd編) 
企画開発Gr. 
菊池大輔
概要 
• Fluentd + Elasticsearch + Kibana 
• Fluentdについて 
• とあるプロジェクトの一例
Fluentd + Elasticsearch+ Kibana 
ログの収集から可視化まで行なう 
• Fluentdでログを収集して・・・ 
• Elasticsearchで溜め、集計して・・・ 
• Kibanaで可視化する!
図で表すと・・・ 
ログを渡す 
実際の運用はこうではないが、こんな感じ 
ログを収集 
ログを収集 
ログを収集 
可視化! 
ログを溜める
今日やるのは・・・ 
ここ! 
ログを渡す 
ログを収集 
ログを収集 
ログを収集 
可視化! 
ログを溜めて集計
Fluentd 
• ログの収集方法や出力先を柔軟にカスタマイ 
ズできるOSS 
• Ruby(一部C)で実装されている 
• プログラマブルなログ収集が可能
導入方法 
• RPM、DMGパッケージでインストール 
• Ruby Gemでインストール 
• ソースコードからインストール
Fluentdのアーキテクチャ 
インプット 
プラグイン 
(入力元の定義) 
HTTP 
File tail 
forward 
exec 
バッファ 
プラグイン 
(バッファ形式) 
file 
memory 
アウトプット 
プラグイン 
(出力先の定義) 
(バッファ) 
forward 
file 
(非バッファ) 
copy 
stdout 
それぞれ用途によって使い分ける。更にプラグインも作成可能!
インプットプラグイン 
• HTTP 
– POST等で受け取ったデータを入力元にする 
• File tail 
– tail -Fコマンドと同じように、ファイルの末尾を取得 
• Forward 
– 他のfluentdから送られてきたデータを入力元に 
• Exec 
– Fluentdが動いているマシンのコマンド実行結果
バッファプラグイン 
• File 
– 出力前のログをファイルにしておく 
• Memory 
– 出力前のログをメモリ上においておく
アウトプットプラグイン 
• バッファアウトプットプラグイン 
– 出力前にバッファに溜めておき出力する 
• Forward:他のfluentdに出力 
• File:ファイルに出力 
• 非バッファアウトプットプラグイン 
– 受け取ったらすぐ出力する 
• Copy: 複数の出力先に出力 
• Stdout: 受け取ったログを標準出力
他にも・・・ 
• 紹介したのは「標準プラグイン」 
– 既にfluentdのコアとして取り込まれているもの 
• プラグイン多数!(コミュニティが活発) 
– MySQLのスロークエリログを入力元に 
– ElasticsearchやLeftronic、mongoDBを出力先に 
• PluginはRubyで書ける
インプットプラグインの処理 
• イベントを待ち受ける 
• ログを取得すると、以下の情報を付加する 
– タグデータ(出力先を決めるためのもの) 
– 時刻データ(ログのタイムスタンプ) 
• アウトプットプラグインに渡す 
– タグデータを基に処理を振り分ける
アウトプットプラグインの処理 
• タグ、時刻各データをまとめたもの(Chunk)を 
Queueに入れる 
(バッファアウトプットプラグインの場合) 
• 出力先の形式(ファイル、JSON、etc…)に合わ 
せて出力する
fluentdの設定ファイル(入力例) 
<source> 
type tail 
path /var/log/httpd-access.log 
tag apache.access 
format apache 
</source> 
・Apacheログの末尾を読み取る 
・タグ(出力先を決める際に使うもの)を「apache.access」とする
fluentdの設定ファイル(出力例) 
<match apache.access> 
type copy 
<store> 
type forward 
buffer_type file 
send_timeout 60s 
<server> 
host 192.168.11.3 
</server> 
</store> 
: 
</match> 
バッファ(file)に溜めてから送信 
Copy 
Forward 
… 
… 
すぐに送信
Webアプリからどう送るか? 
• fluent-logger 
– RubyのHashやJavaのHashMapを、fluentdが読め 
る形にして送信してくれる 
– 対応言語多数 
• python 
• node.js 
• Scala 
• etc…
fluent-logger(Rubyの例) 
# loggerを用意して・・・ 
logger = Fluent::Logger::FluentLogger.new(nil, 
{:host => config['fluent_logger'][:host], 
:port => config['fluent_logger'][:port] }) 
# Hashをpostする 
logger.post(‘webapp.pageview’, 
{ :path => ‘/index’, 
:user_id => ‘5500’ }) タグ
とあるプロジェクトの一例 
Web 
サーバ 
Watch 
サーバ 
History 
サーバ 
Forward 
Elasticsearch 
プラグイン 
アプリから 
ログを収集 
{ user_id: 33104, 
path: ‘/th/companies’}
まとめ 
• Fluentdは、ログの入力元やバッファの方法、 
出力先まで、柔軟なログ収集ができる 
• Rubyで書かれており、プラグインもRubyで 
開発できる

Fluentd+elasticsearch+kibana(fluentd編)