LoginSignup
1
0

More than 5 years have passed since last update.

Ruby で Amazon S3 の http アクセスログをパースする

Last updated at Posted at 2018-01-11

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

なお、パフォーマンスの測定等はしていない。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0