Class: RailsLogParser::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_log_parser/parser.rb

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeParser

Returns a new instance of Parser.



40
41
42
43
44
45
46
# File 'lib/rails_log_parser/parser.rb', line 40

def initialize
  config_file = File.join(Dir.pwd,'config/rails_log_parser.rb')
  require config_file if File.file?(config_file)

  @actions = {}
  @not_parseable_lines = RailsLogParser::NotParseableLines.new
end

Class Attribute Details

.log_pathObject



7
8
9
# File 'lib/rails_log_parser/parser.rb', line 7

def log_path
  @log_path || ENV['LOG_PATH'] || raise('no log_path given')
end

Instance Attribute Details

#last_actionObject (readonly)

Returns the value of attribute last_action.



38
39
40
# File 'lib/rails_log_parser/parser.rb', line 38

def last_action
  @last_action
end

#not_parseable_linesObject (readonly)

Returns the value of attribute not_parseable_lines.



38
39
40
# File 'lib/rails_log_parser/parser.rb', line 38

def not_parseable_lines
  @not_parseable_lines
end

Class Method Details

.from_file(path) ⇒ Object



21
22
23
24
25
# File 'lib/rails_log_parser/parser.rb', line 21

def from_file(path)
  File.open(path, 'r') do |file|
    from_io(file)
  end
end

.from_io(io) ⇒ Object



11
12
13
14
15
16
17
18
19
# File 'lib/rails_log_parser/parser.rb', line 11

def from_io(io)
  parser = new

  io.each_line do |line|
    parser.puts(line)
  end

  parser
end

.from_journalctl(unit:, since: nil) ⇒ Object



27
28
29
30
31
32
33
34
35
# File 'lib/rails_log_parser/parser.rb', line 27

def from_journalctl(unit:, since: nil)
  cmd = ["journalctl", "-u", unit, "-o", "cat"]

  cmd += ["--since", since] if since

  IO.popen(cmd, err: [:child, :out]) do |io|
    from_io(io)
  end
end

Instance Method Details

#action(type, params) ⇒ Object



83
84
85
86
87
88
89
# File 'lib/rails_log_parser/parser.rb', line 83

def action(type, params)
  @actions[params['id']] ||= RailsLogParser::Action.new(type, params['id'])
  @actions[params['id']].severity = params['severity_label']
  @actions[params['id']].datetime = params['datetime']
  @actions[params['id']].add_message(params['message']) unless params['message'].nil?
  @last_action = @actions[params['id']]
end

#actionsObject



75
76
77
# File 'lib/rails_log_parser/parser.rb', line 75

def actions
  @actions.values
end

#active_job(params) ⇒ Object



107
108
109
# File 'lib/rails_log_parser/parser.rb', line 107

def active_job(params)
  action(:active_job, params)
end

#add_message(params) ⇒ Object



115
116
117
118
# File 'lib/rails_log_parser/parser.rb', line 115

def add_message(params)
  @actions[params['id']] ||= RailsLogParser::Action.new(type, params['id'])
  @actions[params['id']].add_message(params['message'])
end

#delayed_job(params) ⇒ Object



111
112
113
# File 'lib/rails_log_parser/parser.rb', line 111

def delayed_job(params)
  action(:delayed_job, params)
end

#empty_line(params) ⇒ Object



95
96
97
98
99
# File 'lib/rails_log_parser/parser.rb', line 95

def empty_line(params)
  params = params.named_captures
  params['message'] = nil
  action(:request, params)
end

#puts(line) ⇒ Object



79
80
81
# File 'lib/rails_log_parser/parser.rb', line 79

def puts(line)
  RailsLogParser::Line.new(self, line.encode('UTF-8', invalid: :replace))
end

#request(params) ⇒ Object



91
92
93
# File 'lib/rails_log_parser/parser.rb', line 91

def request(params)
  action(:request, params)
end

#summary(last_minutes: nil) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/rails_log_parser/parser.rb', line 49

def summary(last_minutes: nil)
  relevant = actions
  if last_minutes.present?
    from = last_minutes.to_i.minutes.ago
    relevant = relevant.select { |a| a.after?(from) }
  end
  summary_output = []
  if @not_parseable_lines.lines.present?
    summary_output.push('Not parseable lines:')
    summary_output += @not_parseable_lines.lines.map { |line| "  #{line}" }
    summary_output.push("\n\n")
    @not_parseable_lines.save
  end

  %i[warn error fatal].each do |severity|
    selected = relevant.select { |a| a.public_send("#{severity}?") }.reject(&:known_exception?).reject(&:ignore?)
    next if selected.blank?

    summary_output.push("#{selected.count} lines with #{severity}:")
    summary_output += selected.map(&:headline).map { |line| "  #{line}" }
    summary_output.push("\n\n")
  end

  summary_output.join("\n")
end

#without_request(params) ⇒ Object



101
102
103
104
105
# File 'lib/rails_log_parser/parser.rb', line 101

def without_request(params)
  params = params.named_captures
  params['id'] = SecureRandom.uuid
  action(:without_request, params)
end