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