Glide Note

glidenote's blog

Subsonic+Nginxのアクセスログをfluentdを利用してMongoDBに入れてみた

Fluentd Casual Talksに参加し、fluentdの使いどころが理解できて、 意識が高いうちに早速fluentdの導入をしSubsonic+nginxのアクセスログをMongoDBに入れてみたのでメモ。

導入環境はwebサーバCentOS 6、ログ収集サーバがCentOS 5で、fluentdのバージョンは td-agent-1.1.5.1-0.x86_64になります。いずれもさくらVPSで稼働させています。 nginxの導入は以前書いた下記のエントリを参考にして下さい。

今回行った作業の流れ

fluentdを初めて触るので、今回は下記のように順を追って検証と導入を行いました。

  • fluentdの導入
  • サーバ1台でwebサーバとログ収集サーバを動かしてみる
  • webサーバとログ収集用サーバをそれぞれ用意して動かして見る
  • ログ収集用サーバにMongoDBを入れて、データを入れてみる

fluentd(td-agent)の導入

Installing td-agent for Redhat and CentOSに 記載してある方法で、yum経由で導入。webサーバ、ログサーバ双方に導入します。/etc/td-agent/td-agent.confは用途に合わせ編集します。

webサーバとログ収集サーバを同じサーバで動かした場合

とりあえずfluentdの動作検証のために、1台で動かしてみて、ローカルのファイルに書き出してみる。

/etc/td-agent/td-agent.confは下記のような感じ。

nginxのログローマットをapacheと合わせるために下記のように修正。(これに気づかずかなりハマりました。)

設定を反映させて再起動。

1
2
sudo /etc/rc.d/init.d/td-agent restart
sudo /etc/rc.d/init.d/nginx restart

実際にnginxのアクセスログが、fluentdに渡って/var/log/td-agent/access_logへ出力されている

webサーバ、ログ収集サーバの2台構成で動かした場合

webサーバ側のtd-agent.confを下記のように修正してtd-agentの再起動

ログサーバ側のtd-agent.confを下記のように修正してtd-agentの再起動

ログサーバ側のiptablesに追記した内容。webサーバからログサーバの24224portへのアクセスを許可してます。

ログサーバの/var/log/td-agent/access_logに出力されていればOK

webサーバ、ログ収集サーバの2台構成で動かして、MongoDBにデータを入れる

/var/log/td-agent/access_logへの出力から、MongoDBに切り替え

MongoDBの導入

1
2
3
4
5
6
7
8
9
/bin/cat <<'EOF'> /etc/yum.repos.d/10gen.repo
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
EOF

yum install  mongo-10gen mongo-10gen-server --enablerepo=10gen
/etc/rc.d/init.d/mongod start

MongoDBにデータを入れられるように、fluent-plugin-mongoの導入。

1
/usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-mongo

ログサーバのtd-agent.confを下記のように修正してtd-agentの再起動。

実際にnginxのアクセスログが、MongoDBに入っているのを確認。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[akira@vps001] $ mongo
MongoDB shell version: 2.0.5
connecting to: test
> show dbs
local   (empty)
nginx   0.203125GB
> use nginx
switched to db nginx
> show collections
access
system.indexes
> db.access.find();
{ "_id" : ObjectId("4fb8aa9ae304e43491000001"), "host" : "110.165.232.124", "user" : "-", "method" : "GET", "path" : "/index.view", "code" : "200", "size" : "639", "referer" : "http://music.glidenote.com/", "agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5", "time" : ISODate("2012-05-20T08:25:01Z") }
{ "_id" : ObjectId("4fb8aa9ae304e43491000002"), "host" : "110.165.232.124", "user" : "-", "method" : "GET", "path" : "/favicon.ico", "code" : "404", "size" : "290", "referer" : "-", "agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5", "time" : ISODate("2012-05-20T08:25:01Z") }

おー、ちゃんとデータが入っている。
でもMongoDBが全く分からないので、集計は後でやってみる。

今回の作業ではまった点

  • nginxのlogフォーマットがapache形式と違っていたので、まったく出力されなかった。(fluentdが動いているのか判断出来なかった)
  • fluentdがudpで通信をしていた。sudo tcpdump -i eth0 port 24224 -nnで気づいたのでiptablesで許可
  • 動作確認コマンドがよく分からなかった。debugを有効にしてecho '{"hoge":"fuga"}' | /usr/lib64/fluent/ruby/bin/fluent-cat debug.testで動いているのを確認。
  • 2011年11月頃に書かれたサイトを参考に作業をしていたら、当時からconfの書き方とか変わっていてハマった。(バージョンを確認しましょう)

参考サイト

参考書籍

fluentdは開発が非常に活発なんですが、ドキュメント類が充実していないので、少し前のウェブ上の情報が使えないことが多かったです。 2012年5月20日現在は下記のSoftware Designが一番充実しているので必読です。

Comments