取り急ぎ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 件のコメント:
コメントを投稿