Module: LogStats::LineParser

Defined in:
lib/log_stats/line_parser.rb

Class Method Summary collapse

Class Method Details

.parse(log_data, config) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
# File 'lib/log_stats/line_parser.rb', line 3

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

.parse_field(field, line_string, event_config) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/log_stats/line_parser.rb', line 29

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

.parse_line(line_string, event_config) ⇒ Object



44
45
46
47
48
49
50
51
# File 'lib/log_stats/line_parser.rb', line 44

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

.parse_numeric(value) ⇒ Object



25
26
27
# File 'lib/log_stats/line_parser.rb', line 25

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

.strip_quotes(value) ⇒ Object



17
18
19
20
21
22
23
# File 'lib/log_stats/line_parser.rb', line 17

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