fluentdを使ってみたメモ。
簡単な動かし方、設定ファイルの書き方一覧を書いています。
fluentdはログの転送・集約を簡単に行うためのツール
fluentd
ログの転送・集約を行うためのツール。複数台のサーバーを運用している時にそれぞれのサーバーにたまるログを、簡単な記述で特定の場所に集約できる。
今までは同じことをどうやって実現していたの?
バッチでコピーしたり、似たようなことをやるScribeというツールを使っていた。この方法だと、設定が複雑になりがちだし、バッチだとリアルタイムに処理することができなかった。
fluentdの利点は?
設定が簡単、かつリアルタイムに処理できること。fluentdを使うとバッチではなくリアルタイムなストリーミング処理ができる。
fluentとfluentdのどっちの読み方が正しいの?
一応、fluentdが正しいっぽいです。
fluentdのインストール方法
簡単なのは、GemやRPMを使ったインストール。yumでのインストールも自分でリポジトリの場所を指定すればできる。どの方法を使っても簡単です。詳しくは公式サイトを見てください。
ここではGemを使ったインストール方法のみ書きます。
$ gem install fluentd --no-ri --no-rdoc # カレントディレクトリに設定ファイルを作ります $ fluentd --setup ./fluent # fluentdの実行。デーモン起動オプションもあります $ fluentd -c ./fluent/fluent.conf -vv &
インストールはたったこれだけです。
設定ファイルの簡単な解説
設定ファイルに含まれるのは以下の3要素のみです。それぞれ簡単に解説します。公式解説ページのリンクも貼っておきます。
# sourceディレクティブ。入力方法を決める <source> type forward </source>
# matchディレクティブ。マッチした入力への処理を決める <match index.html> type file path /var/log/fluent/access1 </match>
# includeディレクティブ。複数のconfファイルをインクルードする時に使う # http経由の指定も可能 include config.d/*.conf include http://example.com/fluent.conf
sourceディレクティブ
ログの入力方法を決める。デフォルトで使えるものは、標準入力、ファイル、ポート指定のHTTP通信、等がある。
matchディレクティブ
ここでマッチしたログに、指定した処理を適用する。デフォルトで使えるものには、標準出力、ファイル、他のfluentサーバーへの転送、これまでに挙げた方法を組み合わせる、等がある。
includeディレクティブ
複数の設定ファイルを設定することができる。/etc/log/httpd/conf.d/*.confのようなイメージ。
tag(タグ)
ログを指定するIDのようなものです。matchディレクティブで指定する「debug.test」とかがタグの一例です。詳しくはfluentd公式FAQを読んでみてください。
fluentdの起動と停止
Gemでインストールしてバックグラウンドプロセスとして起動した場合は下記のコマンドで起動・停止ができます。
# fluentdの実行。デーモン起動オプションもあります $ fluentd -c ./fluent/fluent.conf -vv & # jobsで番号を調べてから kill % [job id]
RPMでインストールした場合は、下記のように/etc/init.d/から普通に起動・停止できます。
$ /etc/init.d/td-agent start $ /etc/init.d/td-agent stop $ /etc/init.d/td-agent restart $ /etc/init.d/td-agent status
簡単な設定方法
まず最初に注意点。matchディレクティブは最初にマッチしたやつのみ適用されます。ログの出力先が複数ある場合の設定方法はもっと下の方に書いています。
標準入力→標準出力
matchディレクティブでdebug.**を指定しているので、debug.aaaでもひっかかります。
matchディレクティブで使える正規表現は公式サイトを参照してください。
# 設定ファイルの中身はこれだけ <source> type forward </source> <match debug.**> type stdout </match>
# 設定ファイルを指定して起動 $ fluentd -c ./fluent/fluent.conf -vv & # 標準出力に結果が表示されます $ echo '{"json":"message dayo"}' | fluent-cat debug.test
標準入力→ファイル
<source> type forward </source> <match apache.access> type file path /var/log/fluent/access </match>
# 設定ファイルを指定して起動 $ fluentd -c ./fluent/fluent.conf -vv & # 指定したファイルに結果が表示されます $ echo '{"json":"message dayo"}' | fluent-cat apache.access
アクセスログ→ファイル
<source> type tail format apache path /var/log/httpd-access.log tag apache.access </source> <match apache.access> type file path /var/log/fluent/access </match>
# 設定ファイルを指定して起動 $ fluentd -c ./fluent/fluent.conf -vv & # アクセスログ経由で、指定したファイルに結果が表示されます $ curl http://localhost/index.html -F 'json={"log":"test_dayo"}'
特定のポートへのHTTP通信→ファイル
この場合、8888ポートはfluentdがListenすることになるので、8888は未使用のポートである必要があります。
# http://localhost:8888/<tag>?json=<json> <source> type http port 8888 </source> <match index.html> type file path /var/log/fluent/access </match>
# 設定ファイルを指定して起動 $ fluentd -c ./fluent/fluent.conf -vv & # 指定したファイルに結果が表示されます。この場合はindex.htmlタグにひっかかる $ curl http://localhost:8888/index.html -F 'json={"log":"test_dayo"}' # この場合はaaa.index.htmlタグにひっかかる $ curl http://localhost:8888/aaa/index.html -F 'json={"log":"test_dayo"}'
ちょっと高度な設定方法
ログの集約を担当する他のfluentdサーバーへログを転送
ログを集約する方法については公式サイトにもうちょっと詳しく書いてあります。
Fluentd High Availability Configuration
# ログ転送側fluentdの設定ファイル <match mytag.**> type forward # primary host <server> host 192.168.0.1 port 24224 </server> # use secondary host <server> host 192.168.0.2 port 24224 standby </server> # use longer flush_interval to reduce CPU usage. # note that this is a trade-off against latency. flush_interval 60s </match>
# ログ受け取り側fluentdの設定ファイル # Input <source> type forward port 24224 </source> # Output <match mytag.**> ... </match>
出力先を複数指定
<match myapp.**> type copy # 標準出力 <store> type stdout </store> # ファイル <store> type file path /var/log/fluent/myapp </store> # 他のfluentdサーバーへ転送 <store> type forward host 192.168.0.13 buffer_type file buffer_path /var/log/fluent/myapp-forward retry_limit 50 flush_interval 10s </store> </match>
その他の出力方法
# fluentの内部イベントログを出力 <match fluent.**> type null </match>
マッチしなかったログを指定ファイルへ保存。ついでに圧縮 <match **> type file path /var/log/fluent/else compress gz </match>
各種プログラミング言語からのログ入力
疲れたのでまた今度。
mongoDB、HDFLへの出力
疲れたのでまた今度。