標準入力から読んでFluentdに送信するにはfluent-agent-liteが便利

標準入力から受けたログを syslog に送信する場合に使えるのが logger(1) コマンドです。

$ echo "log message" | logger -t myapp -p local0.info

自分のところではバッチ処理の出力や、daemontools で起動したコマンドの出力を log/run で logger に渡して syslog に集約するなどしていました。

これを syslog ではなく、Fluentd に送りたい場合にどうするか。


Fluentd 本体には fluent-cat というコマンドが同梱されていますが、これは入力に JSON 形式を要求するので単純に代替はできません。

何か適当なワンライナーで wrap する手もありますが……

$ echo "log message" | perl -MJSON -nE 'say JSON::encode_json({message => $_})' | fluent-cat myapp.info

このような場合に便利なのが fluent-agent-lite です。
/etc/init.d の起動スクリプトからではなく、コマンド単体で起動して入力ファイルに - を指定することで、標準入力から読み取った内容を Fluentd に送信できます。

$ echo "log message" | /path/to/bin/fluent-agent-lite myapp.info - localhost
2012-06-11 09:10:21 +0900 myapp.info: {"message":"log message"}

他の引数については -h オプションを付けて起動すると使用方法が出力されます。

$ bin/fluent-agent-lite -h
Usage: fluent-agent-lite [options] TAG TARGET_FILE PRIMARY_SERVER[:PORT] [SECONDARY_SERVER[:PORT]]
       fluent-agent-lite -p SERVER_LIST_FILE [-s SERVER_LIST_FILE] [options] TAG TARGET_FILE

       port default: 24224
Options:
     -f FIELDNAME       fieldname of fluentd log message attribute (DEFAULT: message)
     -p LIST_PATH       primary servers list (server[:port] per line, random selected one server)
     -s LIST_PATH       secondary servers list (server[:port] per line, random selected one server)
     -b BUF_SIZE        log tailing buffer size (DEFAULT: 1MB)
     -n NICE            tail process nice (DEFAULT: 0)
     -t TAIL_PATH       tail path (DEFAULT: /usr/bin/tail)
     -i SECONDS         tail -F sleep interval (GNU tail ONLY, DEFAULT: tail default)
     -l LOG_PATH        log file path (DEFAULT: /tmp/fluent-agent.log)
     -d DRAIN_LOG_TAG   emits drain log to fluentd: messages per drain/send (DEFAULT: not to emits)
     -j                 use JSON for message structure in transfering (highly experimental)
     -v                 output logs of level debug and info (DEFAULT: warn/crit only)
     -h                 print this message

以上、syslog を Fluentd で置き換える場合に使える便利な小ネタでした。