【作業メモ】Apacheログをfluentd+MongoDBで収集しRubyで集計してみたが…
ものすごく流行の波に乗り遅れた感がありますがfluentd入れてみました。
fluentdとは
作者の古橋さんのブログから引用
http://d.hatena.ne.jp/viver/20110929/p1
-
-
-
-
-
-
- -
-
-
-
-
-
fluent は syslogd のようなツールで、イベントログの転送や集約をするためのコンパクトなツールです。
ただ syslogd とは異なり、ログメッセージに テキストではなく JSON オブジェクト を使います。また プラグインアーキテクチャ を採用しており、ログの入力元や出力先を簡単に追加できます。
-
-
-
-
-
-
- -
-
-
-
-
-
ログを素敵な感じで別サーバに転送、集約することが可能です。
ログはJSON形式で構造化されているのでログデータが利用しやすいのも特徴です。
手順
※前提としてapacheが稼働済みであるとします
fluentdインストール
yumでさくっと
vim /etc/yum.repos.d/td.repo
[treasuredata] name=TreasureData baseurl=http://packages.treasure-data.com/redhat/$basearch gpgcheck=0
yum install td-agent
mongoDBインストール
yumでさくっと
vi /etc/yum.repos.d/10gen.repo [10gen] name=10gen Repository baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64 gpgcheck=0
yum install mongo-10gen* --enablerepo=10gen
mongodb起動
/etc/init.d/mongod start
td-agentの通常動作の確認
td-agent設定変更
mkdir /var/log/fluent chown td-agent:td-agent /var/log/fluent
vim /etc/td-agent/td-agent.conf
<source> type tail format apache path /var/log/httpd/access_log tag apache.access </source> <match apache.access> type file path /var/log/fluent/access_log </match>
chmod g+rx /var/log/httpd
td-agent起動
service td-agent start
curlでhttp叩いてみる
http://127.0.0.1
tailf /var/log/fluent/access_log.20120426.b4be8dbd2a283078c 2012-04-26T13:52:25+09:00 apache.access {"host":"127.0.0.1","user":"-","method":"GET","path":"/","code":"200","size":"5","referer":"-","agent":"curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3
出た!こんな感じにログが構造化されて出力されます。
ログをMongoDBに突っ込むように設定
fluent-plugin-mongoのインストール
/usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-mongo
td-agent.confの設定
<source> type tail format apache path /var/log/httpd/access_log tag mongo.apache </source> <match mongo.**> type mongo #DB名とコレクション名 database apache collection access #MongoDB接続先とポート host localhost port 27017 #インターバル flush_interval 10s </match>
td-agent再起動
service td-agent restart
curlで叩いてみる
http://127.0.0.1
MongoDBのデータ確認
mongo
> show dbs apache 0.203125GB > use apache switched to db apache > show collections access system.indexes > db.access.find(); { "_id" : ObjectId("4f98d6c1e138232aef000001"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "200", "size" : "5", "referer" : "-", "agent" : "curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5", "time" : ISODate("2012-04-26T05:01:42Z") }
記録されてる!
これでアクセスするたびにMongoにデータを突っ込んでいきます。
rubyでmongodbに突っ込んだデータを参照する
ステータスコード200以外がどれだけ出てるのかを調べたいと思っているので、こんな感じに。
全アクセスログ件数
#!/usr/lib64/fluent/ruby/bin/ruby # -*- encoding: utf-8 -*- require 'mongo' m = Mongo::Connection.new('localhost', 27017) db = m.db('apache') puts "全件数" puts db['access'].count
HTTPステータスコードが200以外の件数
puts db['access'].find({:code => {"$ne" => '200'}}).count
hostがhogehoge、かつHTTPステータスコードが200以外の件数
puts db['access'].find({:code => {"$ne" => '200'} , :host => '127.0.0.1'}).count
今より1週間以内かつ、hostがhogehogeかつ、HTTPステータスコードが200以外の件数
d = Time.now d = d-24*60*60*7 puts db['access'].find({:code => {"$ne" => '200'} , :host => 'hogehoge' , :time => {"$gt" => d}}).count
これで色々集計すれば超便利そうと思っていました。
が、
今更「fluent-plugin-datacounter」の存在に気が付きました。
どうみてもこっち使ったほうが楽&スマートっぽいので今からやります。
_(:3 」∠)_
完
参考リンク
http://d.hatena.ne.jp/wyukawa/20120207/1328625443
http://d.hatena.ne.jp/oranie/20120206/1328513678
http://d.hatena.ne.jp/oranie/20120424/1335258767
http://www.mongodb.org/pages/viewpage.action?pageId=18907495