S3 のログは独自形式で、ちょっとパースに手間がかかる。自前で処理したくないので、お手軽安全にパースする方法を検討した。
準備
request-log-analyzer という gem に含まれるパーサを使う。
gem install request-log-analyzer
コード
値は #first
で取り出す。#every
もあるが http 系のログでは使うことはないだろう。
require 'request_log_analyzer'
require 'request_log_analyzer/request'
require 'request_log_analyzer/file_format'
require 'time'
format = RequestLogAnalyzer::FileFormat::AmazonS3.create
parser = RequestLogAnalyzer::Source::LogParser.new(format)
line = '300a66dd319290e36b67767f862a7f39072caa70ba33b8d01c4b79ddd8e6d7ef lamestuff.com [05/Oct/2012:15:24:46 +0000] 174.44.160.70 - CE74FF983317B326 REST.GET.OBJECT public/portfolio/22/thumbnail.jpg "GET /lamestuff.com/public/portfolio/22/thumbnail.jpg HTTP/1.1" 200 - 9515 9515 42 41 "http://spike.grobste.in/portfolio" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.14 (KHTML, like Gecko) Version/6.0.1 Safari/536.26.14" -'
parser.parse_line(line) do |request|
puts request.first(:bucket)
puts request.first(:key)
puts Time.parse(request.first(:timestamp).to_s)
end
ログパーサなので #parse_file
や #parse_files
などもある。他にもいろいろなフォーマットに対応しているので便利に使える局面もありそうだ。
含まれるフィールドは次の通り。
bucket_owner
bucket
timestamp
remote_ip
requester
request_id
operation
key
request_uri
http_status
error_code
bytes_sent
object_size
total_time
turnaround_time
referer
user_agent
line_type
lineno
source
なお、パフォーマンスの測定等はしていない。