Fluentd(td-agent)のインストールとPythonからの利用

Fluentdを使おうと思って調べてる。
Fluentdを使うと、各種ログを集約したり、いろいろな出力先に振り分けたりが簡単にできる。
Rubyで実装されていて、gemでインストールすることができるけど、今回はRubyの実行環境も含めてパッケージ化されたtd-agentを使う。
GitHub - treasure-data/td-agent: This repository is OBSOLETE, check gh/treasure-data/omnibus-td-agent
バージョンはUbuntu 12.04(precise)、Python 2.7、td-agent 0.10.35、fluent-logger-python 0.3.3。
ドキュメントがあるので、この通りでよさそう。
http://help.treasure-data.com/kb/installing-td-agent-daemon/installing-td-agent-for-debian-and-ubuntu

td-agentのインストール

td-agentのインストールは、インストール用スクリプトをダウンロードして実行する。

$ curl -L http://toolbelt.treasure-data.com/sh/install-ubuntu-precise.sh | sh

スクリプト内でsudoを使っているので、管理者権限が必要。
設定ファイルは、 /etc/td-agent/td-agent.conf となる。
もし、TresureDataのサービスへログをアップロードしたい場合は、APIキーを取得して設定する。

td-agentの起動、終了、再起動

init.dスクリプトで起動、終了、再起動する。

$ sudo /etc/init.d/td-agent start
$ sudo /etc/init.d/td-agent stop
$ sudo /etc/init.d/td-agent restart

この辺はあとでUpstartで動くように変更したほうが個人的には嬉しいかも。

curlでデータを投げてみる

デフォルト設定では8888ポートで起動し、debug.*というパスならstdoutに出力されるので、これをcurlで試す。

$ curl -X POST -d 'json={"foo":"bar","fuga":2}' http://localhost:8888/debug.hoge

デフォルトではstdoutの出力は /var/log/td-agent/td-agent.log に出力されるので、tailで確認する。

$ tail -n 1 /var/log/td-agent/td-agent.log
2013-07-18 01:56:34 +0900 debug.hoge: {"foo":"bar","fuga":2}

これでtd-agentの動作を確認できた。

Pythonからデータを投げてみる

PythonからFluentdにデータを投げるには、fluent-loggerモジュールを使うと簡単。
GitHub - fluent/fluent-logger-python: A structured logger for Fluentd (Python)
fluent-logger 0.4.1 : Python Package Index
virtualenv環境にインストールしてみる。

$ virtualenv fluent-test
New python executable in fluent-test/bin/python
Installing setuptools............done.
Installing pip...............done.
$ source fluent-test/bin/activate
(fluent-test)$ pip install fluent-logger
fluent_test.py

単純にログを1回だけ投げてみるスクリプトを用意。

from fluent import sender, event


def main():
    sender.setup('debug')
    event.Event('from_python', {'foo': 'bar', 'test': 123})

if __name__ == '__main__':
    main()

setupの第一引数で、prefixを指定できるようだ。

実行結果

スクリプトを実行するとFluentdにログが投げられるので、tailで確認する。

(fluent-test)$ python fluent_test.py
(fluent-test)$ tail -n 1 /var/log/td-agent/td-agent.log
2013-07-18 02:11:04 +0900 debug.from_python: {"test":123,"foo":"bar"}

特にハマることなく、うまく動かせた。