universal-access-log-parser

Installation

gem install universal-access-log-parser

Usage

require 'universal-access-log-parser'

# use predefined parser
parser = UniversalAccessLogParser.apache_combined

# or extend it inline
parser = UniversalAccessLogParser.new do
    # reuse predefined element set
    apache_combined

    # add your own
    string :varnish
    string :varnish_status, :nil_on => '-'
    string :initial_varnish_status, :nil_on => '-'
    integer :cache_hits
    integer :cache_ttl, :nil_on => '-'
    integer :cache_age
end

# or define new parser
UniversalAccessLogParser.parser(:iis) do
    skip_line '^#'
    date_iis :time
    ip :server_ip
    string :method
    string :url
    string :query, :nil_on => '-'
    integer :port
    string :username, :nil_on => '-'
    ip :client_ip
    string :user_agent, :nil_on => '-', :process => lambda{|s| s.tr('+', ' ')}
    integer :status
    integer :substatus
    integer :win32_status
    integer :duration, :process => lambda{|i| i.to_f / 1000}
end
parser = UniversalAccessLogParser.iis

# and iterate entries with #each - won't raise errors
stats = parser.parse_file('access.log').each |entry|
    puts entry.time
    puts entry.cache_age
end

# and get parsing stats
puts stats.failures
puts stats.successes	

# or wait for exception with #each!
parser.parse_file('access.log').each! |entry|
    puts entry.time
    puts entry.cache_age
end # will raise UniversalAccessLogParser::ParsingError on line parsing error

# data elements wont be parsed until accessed, so if you are not interested in some elements you won't waste time
stats = parser.parse_file('access.log').each |entry|
    # entry.time not parsed yet - Time object is not created
    puts entry.time # this will parse time and create Time object - this may raise UniversalAccessLogParser::ElementParsingError!
    puts entry.time # now Time object is returned from cache
    puts entry.cache_age

    # parse all elements
    entry.parse!

    # this will also parse all elements and return hash map of them
    entry.to_hash 
end

# iterate and parse all data with #each_parsed! - if this won't raise, all log lines are parsing fine including elements
parser.parse_file('access.log').each_parsed! |entry|
    puts entry.time # already in cache
    puts entry.cache_age # already in cache
end # will raise on line and element parsing error - try rescuing UniversalAccessLogParser::ParserError to catch both

Contributing to universal-access-log-parser

  • Please add more common parsers to lib/common_parsers.rb and rspec in spec/common_parsers_spec.rb or send me a gist

  • Check out the latest master to make sure the feature hasn’t been implemented or the bug hasn’t been fixed yet

  • Check out the issue tracker to make sure someone already hasn’t requested it and/or contributed it

  • Fork the project

  • Start a feature/bugfix branch

  • Commit and push until you are happy with your contribution

  • Make sure to add tests for it. This is important so I don’t break it in a future version unintentionally.

  • Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.

Copyright © 2011 Jakub Pastuszek. See LICENSE.txt for further details.