FAT47の底辺インフラ議事録

学んだことのメモ帳です

【作業メモ】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>

/var/log/httpdパーミッション変更

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