Pages

2011/05/03

Nginxのログをmongodbに入れるために

mongoimportが便利でmongodbが柔軟なので、ログを入れたくなる。
取り急ぎWebのログでもいれちゃうか、というお話。
 

HTTPサーバのアクセスログはそれなりの解析ツールもあるんだが、あえてMongoDBに突っ込んでみよう。



既存のログを加工してinsertするか、あるいは出力時点でmongoimportコマンド向けフォーマットにするか、ここでは後者でいってみましょう。
 

combinedからMongo向けへ


デフォルトのapache httpd2のような combinedでどんなパラメータが使われているかは公式のドキュメントHttpLogModuleをみれば分かる。

combinedを参考にしながらmongoimport用にタブ区切りにして、スペースを含む妙な時刻フォーマットもiso8601に変えてしまう。

log_format mongo '$remote_addr\t-\t$remote_user\t$time_iso8601\t'
'"$request"\t$status\t$body_bytes_sent\t'
'"$http_referer"\t"$http_user_agent"';

 


access.logに出力されるログ


間隔はタブです。

192.168.1.226   -       -       2011-05-01T16:40:06+09:00       "GET /nginx_status HTTP/1.1"    200     151     "-"     "libwww-perl/5.836"
127.0.0.1 - - 2011-05-01T16:45:04+09:00 "GET / HTTP/1.0" 200 151 "-" "Wget/1.12 (linux-gnu)"
192.168.1.226 - - 2011-05-01T16:45:06+09:00 "GET /nginx_status HTTP/1.1" 200 151 "-" "libwww-perl/5.836"
127.0.0.1 - - 2011-05-01T16:50:06+09:00 "GET / HTTP/1.0" 200 151 "-" "Wget/1.12 (linux-gnu)"
192.168.1.226 - - 2011-05-01T16:50:08+09:00 "GET /nginx_status HTTP/1.1" 200 151 "-" "libwww-perl/5.836"
127.0.0.1 - - 2011-05-01T16:55:07+09:00 "GET / HTTP/1.0" 200 151 "-" "Wget/1.12 (linux-gnu)"
192.168.1.226 - - 2011-05-01T16:55:11+09:00 "GET /nginx_status HTTP/1.1" 200 151 "-" "libwww-perl/5.836"
127.0.0.1 - - 2011-05-01T17:00:04+09:00 "GET / HTTP/1.0" 200 151 "-" "Wget/1.12 (linux-gnu)"
192.168.1.226 - - 2011-05-01T17:00:06+09:00 "GET /nginx_status HTTP/1.1" 200 151 "-" "libwww-perl/5.836"


中々美しいですな。
 
 


Mongoへimport


タブで区切ったフィールド名を片っ端から指定してmongoimportして見ます。

mongoimport -d nginxlog -c test01 --type tsv \
-f remote_addr,remote_log,remote_user,time_iso8601,request,status,body_bytes_sent,http_referer,http_user_agent access.log

 

Mongo内のDocument


格納されたドキュメントをmongoのshellからfindでみてみます。
※みやすいように改行を入れています。

{
"_id" : ObjectId("4dbe601dea171c9595cca838"),
"remote_addr" : "192.168.1.96",
"remote_log" : "-", "remote_user" : "-",
"time_iso8601" : "2011-05-01T16:39:49+09:00",
"request" : "\"GET / HTTP/1.1\"",
"status" : 304,
"body_bytes_sent" : 0,
"http_referer" : "\"-\"",
"http_user_agent" : "\"Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20100101 Firefox/4.0\""
}
{
"_id" : ObjectId("4dbe601dea171c9595cca839"),
"remote_addr" : "192.168.1.96",
"remote_log" : "-",
"remote_user" : "-",
"time_iso8601" : "2011-05-01T16:39:49+09:00",
"request" : "\"GET / HTTP/1.1\"",
"status" : 304,
"body_bytes_sent" : 0,
"http_referer" : "\"-\"",
"http_user_agent" : "\"Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20100101 Firefox/4.0\""
}

 

よし。
もちろんapache httpdでも同様にできる。
 

0 件のコメント:

コメントを投稿