rubyでMongoDBにISODateを入れる試み

  • ruby1.9.3

apacheのログなどを解析する場合にはmongodbに一度入れると扱いやすくなります。

そこでこのプレーンテキストのapacheのログをrubyを使っていれる試みをしてみました

この辺りを参考に

http://mironal-memo.blogspot.jp/2012/07/mongodb-ruby.html

gem install mongo
gem install bson_ext

ログからip,時間、urlの3つ、必要なものを抽出します

zcat access.log.gz |awk '{print $1"\t"$4"\t"$7}' > log.txt
#!/bin/env ruby
require "mongo"

conn=Mongo::Connection.new
db=conn.db("database")
col=db.collection("logs")
open("log.txt"){|f|
	f.each{|line|
		line.chomp!
		ay=line.split("\t")
		col.insert({"ip"=>ay[0],"date":"ISODate(Time.parse(ay[1].gsub("[","").sub(":"," ")).strftime('%Y-%m-%dT%H:%M:%SZ'))","url":ay[2])
	}
}

こんな感じで入るのかと思ったのですがISODateにはなりません

仕方がないので一度ファイルにします

  • create.rb
#!/bin/env ruby
puts "use database"
open("log.txt"){|f|
	f.each{|line|
		line.chomp!
		ay=line.split("\t")
		puts 'db.logs.insert({ip:"'+ay[0]+'","date":ISODate("'+Time.parse(ay[1].gsub("[","").sub(":"," ")).strftime('%Y-%m-%dT%H:%M:%SZ'))+'"),"url":"'+ay[2]+'"))'
	}
}
ruby create.rb > mongo.dat
mongo < mongo.dat

これくらいしかわかりませんでした