Fluentdの標準Inputプラグイン
標準添付の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
rubyの Time#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プラグインを見ていこうと思います。