標準入力から受けたログを 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 で置き換える場合に使える便利な小ネタでした。