Module: Rails::Pretty::Logger::DashboardsHelper

Defined in:
app/helpers/rails/pretty/logger/dashboards_helper.rb

Constant Summary collapse

STRUCTURED_LOG_PRIMARY_KEYS =
%w[@timestamp timestamp time datetime created_at severity level log_level message msg].freeze

Instance Method Summary collapse

Instance Method Details

#check_highlight(line) ⇒ Object



5
6
7
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 5

def check_highlight(line)
  rails_pretty_logger_log_entry(line)
end

#is_file_active(name, params) ⇒ Object



39
40
41
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 39

def is_file_active(name, params)
  "active" if params[:log_file] == name
end

#is_page_active(index, params) ⇒ Object



43
44
45
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 43

def is_page_active(index, params)
  "active" if params[:page].to_i == index
end

#is_stdout?Boolean

Returns:

  • (Boolean)


25
26
27
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 25

def is_stdout?
  ENV["RAILS_LOG_TO_STDOUT"].present?
end

#parse_parameters(line) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 47

def parse_parameters(line)
  parameters = line[line.index("Parameters:") + "Parameters:".length..]
  hash = JSON.parse(parameters.gsub("=>", ":"))
  parts = [tag.strong("Parameters:"), tag.br]
  hash.each do |key, value|
    parts << tag.strong("#{key}: ")
    parts << value.to_s
    parts << ", "
  end
  safe_join(parts)
rescue JSON::ParserError, TypeError
  line
end

#rails_pretty_logger_log_entry(entry) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 9

def rails_pretty_logger_log_entry(entry)
  return rails_pretty_logger_request_group(entry) if entry.is_a?(Hash)
  return rails_pretty_logger_structured_log(entry) if rails_pretty_logger_structured_payload(entry)
  return tag.div(entry.remove("[HIGHLIGHT]"), class: "log-line highlight") if entry.include?("[HIGHLIGHT]")

  if entry.include?("Parameters:")
    tag.div(parse_parameters(entry), class: "log-line log-line--parameters")
  else
    tag.div(entry, class: "log-line")
  end
end

#rails_pretty_logger_request_group(group) ⇒ Object



61
62
63
64
65
66
67
68
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 61

def rails_pretty_logger_request_group(group)
  tag.details(class: rails_pretty_logger_request_group_classes(group), open: true) do
    safe_join([
      tag.summary(rails_pretty_logger_request_summary(group), class: "log-request__summary"),
      tag.pre(group.fetch(:lines).join, class: "log-request__body")
    ])
  end
end

#rails_pretty_logger_request_group_classes(group) ⇒ Object



83
84
85
86
87
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 83

def rails_pretty_logger_request_group_classes(group)
  classes = ["log-request"]
  classes << "log-request--error" if group[:status].to_i >= 500
  classes.join(" ")
end

#rails_pretty_logger_request_summary(group) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 70

def rails_pretty_logger_request_summary(group)
  return t("rails_pretty_logger.logs.ungrouped_lines") unless group[:type] == :request

  parts = [
    tag.span(group[:method], class: "log-request__method"),
    tag.span(group[:path], class: "log-request__path")
  ]
  parts << tag.span(group[:status], class: "log-request__status") if group[:status].present?
  parts << tag.span(group[:duration], class: "log-request__duration") if group[:duration].present?

  safe_join(parts, " ")
end

#rails_pretty_logger_structured_header(severity, timestamp, message) ⇒ Object



106
107
108
109
110
111
112
113
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 106

def rails_pretty_logger_structured_header(severity, timestamp, message)
  parts = []
  parts << tag.span(severity, class: "structured-log__severity") if severity.present?
  parts << tag.span(timestamp, class: "structured-log__timestamp") if timestamp.present?
  parts << tag.strong(message, class: "structured-log__message")

  safe_join(parts)
end

#rails_pretty_logger_structured_log(line) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 89

def rails_pretty_logger_structured_log(line)
  payload = rails_pretty_logger_structured_payload(line)
  severity = rails_pretty_logger_structured_value(payload, *Rails::Pretty::Logger::PrettyLogger::STRUCTURED_SEVERITY_KEYS)
  severity ||= rails_pretty_logger_structured_nested_log_level(payload)
  timestamp = rails_pretty_logger_structured_value(payload, *Rails::Pretty::Logger::PrettyLogger::STRUCTURED_TIMESTAMP_KEYS)
  message = payload["message"] || payload["msg"] || line

  tag.div(class: rails_pretty_logger_structured_log_classes(severity)) do
    safe_join([
      tag.div(class: "structured-log__header") do
        rails_pretty_logger_structured_header(severity, timestamp, message)
      end,
      (payload)
    ].compact)
  end
end

#rails_pretty_logger_structured_log_classes(severity) ⇒ Object



129
130
131
132
133
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 129

def rails_pretty_logger_structured_log_classes(severity)
  classes = ["structured-log"]
  classes << "structured-log--#{severity.to_s.downcase}" if severity.present?
  classes.join(" ")
end

#rails_pretty_logger_structured_metadata(payload) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 115

def (payload)
   = payload.reject { |key, _value| STRUCTURED_LOG_PRIMARY_KEYS.include?(key.to_s) }
  return if .blank?

  tag.dl(class: "structured-log__metadata") do
    safe_join(.flat_map do |key, value|
      [
        tag.dt(key),
        tag.dd(value.is_a?(Hash) || value.is_a?(Array) ? JSON.generate(value) : value.to_s)
      ]
    end)
  end
end

#rails_pretty_logger_structured_nested_log_level(payload) ⇒ Object



147
148
149
150
151
152
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 147

def rails_pretty_logger_structured_nested_log_level(payload)
  nested_log = payload["log"]
  return unless nested_log.respond_to?(:[])

  nested_log["level"].to_s.upcase.presence
end

#rails_pretty_logger_structured_payload(line) ⇒ Object



135
136
137
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 135

def rails_pretty_logger_structured_payload(line)
  Rails::Pretty::Logger::PrettyLogger.structured_log_payload(line)
end

#rails_pretty_logger_structured_value(payload, *keys) ⇒ Object



139
140
141
142
143
144
145
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 139

def rails_pretty_logger_structured_value(payload, *keys)
  keys.each do |key|
    return payload[key].to_s if payload[key].present?
  end

  nil
end

#set_divider(params) ⇒ Object



29
30
31
32
33
34
35
36
37
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 29

def set_divider(params)
  if params[:date_range].blank?
    100
  elsif params[:date_range][:divider].blank?
    100
  else
    params[:date_range][:divider]
  end
end

#time_nowObject



21
22
23
# File 'app/helpers/rails/pretty/logger/dashboards_helper.rb', line 21

def time_now
  Time.now.strftime("%Y-%m-%d")
end