fluentd+rails+mongoでサクッとログ環境を整備してみる
今更さわりだしたfluentdですが、簡単に導入まわりをまとめておきます。 rails上でない場合はライブラリは変わりますが、やることはほとんど同じだと思います。
fluentd+railsを動かすまでの手順
fluentd+railsを最短で確認するためは以下のステップが必要です。
- fluentd or td-agentのinstall
- gemfileにtd-loggerを追加してbundle install
- td-loggerの設定ファイル追加
- fluentdサーバーの設定ファイルを作成(fluentd.conf)
- fluentdサーバーを起動
- ログをアプリケーションコードに仕込んでアクセス
- ログがfluentdサーバーから出力されているのを確認
そのあとおまけでmongoDBに出力するところまでやってみます。
実際やってみる
macへfluentdをインストール
gem install fluentd
注:linuxの場合はyumで入れる /etc/yum.repos.d/td.repo
[treasuredata] name=TreasureData baseurl=http://packages.treasure-data.com/redhat/$basearch gpgcheck=0 $ yum update $ yum install td-agent
Gemfleに追加
gem 'td-logger'
gemをインストール
bundle install
送り側となるtd-loggerの設定ファイルをconfig/treasure_data.ymlに作成。ここでどこのfluentdサーバーに送るか定義します。今回は受け側もlocalhostなので以下のようになります。 trpとなってるところはプロジェクトネームなどをおいて下さい。
development: agent: localhost:24224 tag: trp debug_mode: true # enable debug mode production: agent: localhost:24224 tag: trp test:
プロジェクトのルートにfluentdの設定ファイルを作る。
mkdir fluentd vim fluentd/fluentd.conf
とりあえず出力してみる。 fluentd/fluentd.conf
<source> #setting for sending type forward port 24224 </source> <match trp.**> #setting for receiving type stdout </match>
fluentdを起動させましょう。
fluentd -c fluentd/fluentd.conf 2013-11-14 15:30:34 +0900 [info]: starting fluentd-0.10.33 2013-11-14 15:30:34 +0900 [info]: reading config file path="fluentd/fluentd.conf" 2013-11-14 15:30:34 +0900 [info]: using configuration file: <ROOT> <source> type forward port 24224 </source> <match trp.**> type stdout </match> </ROOT> 2013-11-14 15:30:34 +0900 [info]: adding source type="forward" 2013-11-14 15:30:34 +0900 [info]: adding match pattern="trp.**" type="stdout" 2013-11-14 15:30:34 +0900 [info]: listening fluent socket on 0.0.0.0:24224
ちゃんと動くか任意の場所に以下を追加してアクセスしてみます。
TD.event.post('test', {:foo=>:bar})
rails sでサーバーを起動して、アクセスしてみると、先ほどのfluentdのconsole画面に
2013-11-14 15:37:23 +0900 trp.test: {"foo":"bar"}
と出力されます。 シンプルですがこれでinput/outputを確認できました。
ついでに向け先をmongoDBにしてみます。
まずはローカルのmongoを起動させます。
$ /usr/local/bin/mongod all output going to: /usr/local/var/log/mongodb/mongo.log
mongoの様子を見たいときは上記のlogをtail -fすればいいですね。
受け側の定義を変えて、typeをmongoにするだけ。
<source> type forward port 24224 </source> <match trp.access> type mongo # output type database trp # db name collection access # table name # Following attibutes are optional host localhost port 27017 </match>
ログもtable名をaccessに変更します。
TD.event.post('access', {:foo=>:bar})
アクセスが終わったらmongo shellで確認。
$ mongo > use trp switched to db trp > db.access.find() { "_id" : ObjectId("5284760e8b5f352e17000001"), "foo" : "bar", "time" : ISODate("2013-11-14T07:04:03Z") }
mongoにfoo => barが記録されていることを確認!
mongoに入ったログはオブジェクトとして扱えるようになるので集計が楽になりますし、カラムを自由に変更できたり、気軽にログを追加できるメリットもあります。
自由度が高い分、カラムやテーブルを自由気ままに作ってしまうといざほしいデータを整形するときにいろいろメンドくさかったので、ある程度そのログをどう集計するか、なにに使うかを予め決めてから使うと良いと思います。その辺はまたの機会に。
参考:
treasure-data/td-logger-ruby https://github.com/treasure-data/td-logger-ruby
cohakim's blog » Railsからfluentdにイベントログを出力する(開発環境編) http://blog.yabasoft.biz/archives/4401