Module: JsonLogConverter

Defined in:
lib/json_log_converter.rb

Overview

This plays nicely with Technologic’s severity logging methods, writing clean JSON rather than stringified hashes. Call within a ‘config/initializer` to replace `ActiveSupport::TaggedLogging#call` with a custom JSON log formatter.

JsonLogConverter.convert_rails_logger

You can optionally provide a block to the ‘convert_rails_logger` method to hand-craft the log payload yourself:

JsonLogConverter.convert_rails_logger do |severity, timestamp, msg|
  payload = { severity: severity, timestamp: timestamp }
  payload[:tags] = current_tags if current_tags.any?
  payload.merge(msg.is_a?(Hash) ? msg : { message: msg })
end

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.convert_rails_logger(&block) ⇒ Object



17
18
19
20
# File 'lib/json_log_converter.rb', line 17

def self.convert_rails_logger(&block)
  define_method(:log_payload_for, &block) if block_given?
  Rails.logger.formatter.extend self
end

Instance Method Details

#call(severity, timestamp, _progname, msg) ⇒ Object



22
23
24
# File 'lib/json_log_converter.rb', line 22

def call(severity, timestamp, _progname, msg)
  "#{log_payload_for(severity, timestamp, msg).to_json}\n"
end

#default_json_payload(severity, timestamp, msg) ⇒ Object



26
27
28
29
30
# File 'lib/json_log_converter.rb', line 26

def default_json_payload(severity, timestamp, msg)
  payload = { severity: severity, timestamp: timestamp }
  payload[:tags] = current_tags if current_tags.any?
  payload.merge(msg.is_a?(Hash) ? msg : { message: msg })
end

#log_payload_for(severity, timestamp, msg) ⇒ Object



43
44
45
# File 'lib/json_log_converter.rb', line 43

def log_payload_for(severity, timestamp, msg)
  default_json_payload(severity, timestamp, msg)
end

#split_event_key_for_payload(payload) ⇒ Object



32
33
34
35
36
37
38
39
40
41
# File 'lib/json_log_converter.rb', line 32

def split_event_key_for_payload(payload)
  return payload unless payload[:event]&.include? "."

  parts = payload[:event].split(".")
  return payload unless parts.length == 2

  payload[:event] = parts[0]
  payload[:class] = parts[1]
  payload
end