【Ruby】Apacheログのパースを簡単にするApacheLogRegexの使い方

スポンサーリンク

Apache ログのパースが簡単に行える Ruby Gems の ApacheLogRegex についてです。GitHub は 7年前からメンテされてないんですが、とりあえず問題なく使えて非常に便利でした。

使用方法

まずは Gem のインストールをします。

$ gem install apachelogregex

 weppos/apachelogregex · GitHub

ApacheLogRegex は Apache のログのパースを簡単にしてくれるライブラリです。使い方は Apache の Conf ファイルに書かれているLogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""をそのまま使用するだけで、フォーマット文字列をキーにハッシュにパースしてくれ、必要な情報のみを抽出することができます。

require 'apachelogregex'

# LogFormat のフォーマットをそのまま使用してパーサの初期化
format = '%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"'
logParser = ApacheLogRegex.new(format)

# ログをそのまま使用してパースする
line = '120.18.00.133 - - [03/Aug/2015:23:59:59 +0900] "GET /blog/index.html HTTP/1.1" 200 4572 "http://www.task-notes/com/" "Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_4 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile"'
result = logParser.parse(line)

# 結果はハッシュで取得
p result.class
# => Hash
p result
# => {"%h"=>"120.18.00.133", "%l"=>"-", "%u"=>"-", "%t"=>"[03/Aug/2015:23:59:59 +0900]", "%r"=>"GET /blog/index.html HTTP/1.1", "%>s"=>"200", "%b"=>"4572", "%{Referer}i"=>"http://www.task-notes/com/", "%{User-Agent}i"=>"Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_4 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile"}

 mod_log_config - Apache HTTP サーバ バージョン 2.2

パースに失敗した場合

ログのフォーマットと一致しなければparseメソッドの場合 nil が返されますが、parse!メソッドであればParseErrorが返されます。

result = logParser.parse(line)
p result
# => nil

begin
  result = logParser.parse!(line)
rescue RuntimeError => e
  puts %Q(class=[#{e.class}] message=[#{e.message}])
end
# => class=[ApacheLogRegex::ParseError] message=[Invalid format `%hoge %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"` for line `120.18.00.133 - - [03/Aug/2015:23:59:59 +0900] "GET /blog/index.html HTTP/1.1" 200 4572 "http://www.task-notes/com/" "Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_4 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile"`]