stdout-hook と LTSV #fluentdcasual

Fluentd Casual Talks #2 に行ってきました。

のっけから @just_do_neet さんが「1TB強/dayのログを毎日裁いている」とか、「バッファ溢れとかで1TBのログから1件でもデータロスしようものなら障害」とか恐ろしいことをさらっとのたまっていて全然カジュアルじゃない! と焦りましたが、面白かったです。

それぞれのプレゼンのレポートはどなたかがいずれまとめてくれるでしょう。主催者の @tagomoris さんから、ブログ書くようにと指令が出ていたし。

stdout-hook

どれも良かったのですが、@repeatedly さんの stdout-hook が面白かったので反応。

アプリケーションログを fluentd や Treasure Data に送りたい、けどアプリケーションの中にロガー埋め込むのはちょっと気が引ける・・・という人のために、標準出力に吐いたものを fluentd or TD に送り込むもの。もともとは TD の Heroku addon のための機能だったようですが、案外需要があるということで汎用的に使えるようにしたものだそうです。

$ stdout-hook rails s

で起動しておいて標準出力に

@[my.tag] { "hoge" : "fuga" }

とタグつきでワンライナー JSON を出力すると、fluentd か TD に送られる。(デフォルトでは TD に送るように動く。)

LTSV ⇒ ltsview ⇒ stdout-hook ⇒ TD or fluentd

stdout-hook は例によって Unix のパイプとして動くようなので、発表を聴きながら Text::LTSV に同梱していた、LTSV フォーマットフィルタの ltsview を stdout-hook に対応させてみました。ltsview についてはこちら。

ltsview -j

で出力が (色つきYAMLではなく) JSON 化されるオプションをつけて

ltsview -j -t my.tag

で stdout-hook 用のタグも一緒に出力される。例えば Text::LTSV の example ディレクトリに入れている LTSV なアクセスログなら

$ cat example_log.ltsv | ltsview -k time,req -j -t test.access
@[test.access] {"time":"05/Feb/2013:15:34:47 +0000","req":"GET / HTTP/1.1"}
@[test.access] {"time":"05/Feb/2013:15:34:47 +0000","req":"GET /poweredby.png HTTP/1.1"}
@[test.access] {"time":"05/Feb/2013:15:34:47 +0000","req":"GET /nginx-logo.png HTTP/1.1"}
@[test.access] {"time":"05/Feb/2013:15:34:47 +0000","req":"GET /favicon.ico HTTP/1.1"}
@[test.access] {"time":"05/Feb/2013:15:35:06 +0000","req":"-"}

こうなる。

これを stdout-hook にパイプするには

$ cat example_log.ltsv | ltsview -k time,req -j -t test.access | stdout-hook --apikey=<API_KEY>

とすればいい。

$ cat example_log.ltsv | ltsview -j -t test.access | stdout-hook --apikey=<API_KEY>
 [2013-02-15T22:59:24.024439 #19482]  INFO -- : Creating table test.access on Treasure Data

$ td tables test
+----------+--------+------+-------+--------+---------------------------+--------+
| Database | Table  | Type | Count | Size   | Last import               | Schema |
+----------+--------+------+-------+--------+---------------------------+--------+
| test     | access | log  | 5     | 0.0 GB | 2013-02-15 22:59:26 +0900 |        |
+----------+--------+------+-------+--------+---------------------------+--------+

はい、上手に焼けました〜! ちゃんと TD に送られてますね。あとは td query で煮るなりなんなりですな!

ltsview は perl モジュールの Text::LTSV に入ってるので cpanm Text::LTSV でインストールできます。