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, , msg|
payload = { severity: severity, timestamp: }
payload[:tags] = if .any?
payload.merge(msg.is_a?(Hash) ? msg : { message: msg })
end
Class Method Summary collapse
Instance Method Summary collapse
- #call(severity, timestamp, _progname, msg) ⇒ Object
- #default_json_payload(severity, timestamp, msg) ⇒ Object
- #log_payload_for(severity, timestamp, msg) ⇒ Object
- #split_event_key_for_payload(payload) ⇒ Object
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, , _progname, msg) "#{log_payload_for(severity, , 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, , msg) payload = { severity: severity, timestamp: } payload[:tags] = if .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, , msg) default_json_payload(severity, , 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 |