#!/usr/local/bin/ruby require 'date' class LogEntry attr_reader :host, :user, :auth, :date, :referrer, :ua, :rcode, :nbytes, :url @@epat = Regexp.new('^(\S+) (\S+) (\S+) \[(.+)\] "(.+)" (\d{3}) (\d+|-) "(.*?)" "(.*?)"$'); @@rpat = Regexp.new('\A(\S+)\s+(\S+)\s+(\S+)\Z'); def initialize(line) @host, @user, @auth, ds, request, code, bs, @referrer, @ua = @@epat.match(line).captures @date = DateTime.strptime(ds, "%d/%b/%Y:%H:%M:%S %z"); @rcode = Integer(code) @nbytes = (bs == "-" ? 0 : Integer(bs)) @method, @url, @proto = @@rpat.match(request).captures end def to_s() "LogEntry[host:" + host + ", date:" + date.to_s + ", referrer:" + referrer + ", url:" + url + ", ua:" + ua + ", user:" + user + ", auth:" + auth + ", rcode:" + rcode.to_s + ", nbytes:" + nbytes.to_s + "]"; end end # test code if __FILE__ == 'logentry.rb' line = '65.209.65.37 - - [19/Oct/2005:14:26:36 -0500] "GET /xpb4j/xmldata/google/res1.xml HTTP/1.1" 200 11294 "http://www.pankaj-k.net/xpb4j/docs/Measurements-May30/measurements-May30-2002.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)"'; le = LogEntry.new(line); puts le; end