module JsonLogConverter
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
Public Class Methods
convert_rails_logger(&block)
click to toggle source
# 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
Public Instance Methods
call(severity, timestamp, _progname, msg)
click to toggle source
# 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)
click to toggle source
# 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)
click to toggle source
# 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)
click to toggle source
# 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