読者です 読者をやめる 読者になる 読者になる

Fluentdの標準Inputプラグイン

Fluentd

Input Plugin Overview

標準添付のInputプラグインを試していきます。

なおOutput側は切り替えないのでstdoutにすべて出力するようconfを以下のように記述しておきました。

<match **>
  type stdout
</match>

in_forward

TCPソケットを待ち受けます。 主に他のFluentdインスタンスやfluentd-catコマンド、クライアントライブラリからの受信に用います。

以下はconfの例。

<source>
  type forward
  port 24224
</source>

fluentd-catコマンドでログを渡します。

$ echo '{"id":123, "name":"foo"}' | fluent-cat -h localhost -p 24224 test.in_forward

fluent-loggerというライブラリを使ったRubyスクリプト。

require 'fluent-logger'
Fluent::Logger::FluentLogger.open(nil, :host=>'localhost', :port=>24224)
Fluent::Logger.post("test.in_forward", {"id"=>123, "name"=>"foo"})
Fluent::Logger.post("test.in_forward", {"id"=>456, "name"=>"bar"})

in_http

HTTPで待ち受けます。

confの例。

<source>
  type http
  port 8888
  bind 0.0.0.0
  body_size_limit 32m
  keepalive_timeout 3s
</source>

curlコマンドで通信。

$ curl -X POST -d 'json={"id":123,"name":"foo"}' http://localhost:8888/test.in_http

マニュアルにはPOSTを受け取ると書いてありますが ブラウザで以下のアドレスにアクセスしてもログを渡せるので POSTでなくてはならないということでもなさそうです。

http://localhost:8888/test.in_http?json={"id":123,"name":"foo"}

in_tail

テキストファイルの末尾からログを取り出します。 'tail -f'コマンドのイメージです。

confの例。

<source>
  type tail
  tag test.in_tail
  format /^(?<id>[^ ]*) [^ ]* (?<name>[^ ]*) \[(?<time>[^\]]*)\]$/
  time_format %Y-%m-%d %H:%M:%S %Z
  path /tmp/input.log
  pos_file /tmp/input.log.pos
</source>
  • format

    formatを正規表現で定義していますがあらかじめ用意されているformatもあり、 例えばapacheログを読ませる場合はapache2と指定すれば良いです。 (apache2, syslog, json, tsv, csvなどが用意されています。)

  • pos_file

    pos_fileの指定は推奨とのことです。 ファイルの最後の読み込み位置が記録されます。

  • time_format

    rubyTime#strftime を参照。

こんなRubyスクリプトでログを渡してみました。

id = 123
name = "user"

while(true)
  time = Time.now.strftime("%Y-%m-%d %H:%M:%S %Z")

  File.open("/tmp/input.log", "a") {|f|
    f.write "#{id} foo #{name}#{id} [#{time}]\n"
  }

  id += 1
  sleep 3
end

in_exec

外部プログラムを実行し、stdoutに出力されたTSV形式のデータを読み込みます。

<source>
  type exec
  command ruby /tmp/in_exec.rb
  keys tag,time,id,name
  tag_key tag
  time_key time
  time_format %Y-%m-%d %H:%M:%S %Z
  run_interval 10s
</source>
  • keys

    TSVレコードの各フィールドに対応するkeyを並べます。

  • tag_key, time_key

    keysのkeyのどれがtag, timeなのかを指定します。

  • run_interval

    外部プログラムを実行する間隔です。

こんなRubyスクリプトで試しました。

tag = "test.in_exec"
time = Time.now.strftime("%Y-%m-%d %H:%M:%S %Z")
id = 123
name = "foo"
puts "#{tag}\t#{time}\t#{id}\t#{name}\n"

in_syslog

UDPでsyslogプロトコルでログを受信します。

confの例。

<source>
  type syslog
  port 5140
  bind 0.0.0.0
  tag test.in_syslog
</source>

/etc/rsyslog.d/50-default.conf に以下を追加して syslogを送信するように設定します。

*.*   @localhost:5140

rsyslogを再起動します。

$ sudo /etc/init.d/rsyslog restart

in_scribe

scribeというのはFacebookが開発しているログ収集デーモンのことだそうで そのプロトコルでログを待ち受けるようです。当面使うことはなさそうなので割愛。

次は標準添付のOutputプラグインを見ていこうと思います。