fluentdの簡単な使い方、設定方法一覧

fluentdを使ってみたメモ。

簡単な動かし方、設定ファイルの書き方一覧を書いています。


maptail
画像はfluentd公式ページより引用


fluentdはログの転送・集約を簡単に行うためのツール


fluentd

ログの転送・集約を行うためのツール。複数台のサーバーを運用している時にそれぞれのサーバーにたまるログを、簡単な記述で特定の場所に集約できる。


今までは同じことをどうやって実現していたの?

バッチでコピーしたり、似たようなことをやるScribeというツールを使っていた。この方法だと、設定が複雑になりがちだし、バッチだとリアルタイムに処理することができなかった。


fluentdの利点は?

設定が簡単、かつリアルタイムに処理できること。fluentdを使うとバッチではなくリアルタイムなストリーミング処理ができる。


fluentとfluentdのどっちの読み方が正しいの?

一応、fluentdが正しいっぽいです。



fluentdのインストール方法


簡単なのは、GemやRPMを使ったインストール。yumでのインストールも自分でリポジトリの場所を指定すればできる。どの方法を使っても簡単です。詳しくは公式サイトを見てください。

fluentd Installation


ここではGemを使ったインストール方法のみ書きます。


$ gem install fluentd --no-ri --no-rdoc

# カレントディレクトリに設定ファイルを作ります
$ fluentd --setup ./fluent

# fluentdの実行。デーモン起動オプションもあります
$ fluentd -c ./fluent/fluent.conf -vv &

インストールはたったこれだけです。



設定ファイルの簡単な解説


設定ファイルに含まれるのは以下の3要素のみです。それぞれ簡単に解説します。公式解説ページのリンクも貼っておきます。

fluentd Installation


# 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ディレクティブで使える正規表現は公式サイトを参照してください。

fluentd Installation

# 設定ファイルの中身はこれだけ
<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への出力


疲れたのでまた今度。



著者プロフィール
Webサイトをいくつか作っています。
著者プロフィール