Sha256: aad6004c56bf39e18e88c46cd5d27e924fd14d6c52e9e9842a1f0b20213877b2

Contents?: true

Size: 1.44 KB

Versions: 7

Compression:

Stored size: 1.44 KB

Contents

module LogStats
  module LineParser
    def self.parse(log_data, config)
      data = {}
      lines = (log_data.is_a?(String) ? log_data.split("\n") : log_data)
      lines.each do |line_string|
        config[:events].each do |event, event_config|
          if event_config[:line_pattern] =~ line_string
            data[event] ||= []
            data[event].push(parse_line(line_string, event_config))
          end
        end
      end
      data
    end

    def self.strip_quotes(value)
      if value && value.start_with?('"')
        value[1..-2]
      else
        value
      end
    end

    def self.parse_numeric(value)
      value[/\d+/].to_i
    end

    def self.parse_field(field, line_string, event_config)
      if field[:parse]
        value = field[:parse].call(line_string)
      else
        value = /\b#{field[:name]}=(\S+)/.match(line_string).to_a[1]
        value = strip_quotes(value)
        value = parse_numeric(value) if field[:numeric]
      end
      puts "Parsing failed field=#{field} line=#{line_string}" unless (value || field[:optional])
      value
    rescue Exception => e
      puts "Parsing failed field=#{field} line=#{line_string}: #{e.message}"
      nil
    end

    def self.parse_line(line_string, event_config)
      event_config[:fields].reduce({}) do |acc, field|
        if value = parse_field(field, line_string, event_config)
          acc[field[:name]] = value
        end
        acc
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
log_stats-0.4.9 lib/log_stats/line_parser.rb
log_stats-0.4.8 lib/log_stats/line_parser.rb
log_stats-0.4.7 lib/log_stats/line_parser.rb
log_stats-0.4.6 lib/log_stats/line_parser.rb
log_stats-0.4.5 lib/log_stats/line_parser.rb
log_stats-0.4.4 lib/log_stats/line_parser.rb
log_stats-0.4.3 lib/log_stats/line_parser.rb