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"`]