Class: MrLogaLoga::Logger

Inherits:
Logger
  • Object
show all
Defined in:
lib/mr_loga_loga/logger.rb

Overview

Description

This class extends the default Ruby Logger to allow users to attach contextual information to log messages.

Example

This creates a Logger that outputs to the standard output stream, with a level of WARN:

require 'mr_loga_loga'

logger = MrLogaLoga::Logger.new(STDOUT)
logger.level = Logger::WARN

logger.debug("Default")
logger.context(user: 1).debug('with context')

Instance Method Summary collapse

Constructor Details

#initialize(*args, **kwargs) ⇒ Logger

Returns a new instance of Logger.



26
27
28
29
# File 'lib/mr_loga_loga/logger.rb', line 26

def initialize(*args, **kwargs)
  super
  @default_formatter = MrLogaLoga::Formatters::KeyValue.new
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(symbol, *args, &block) ⇒ Object



70
71
72
73
# File 'lib/mr_loga_loga/logger.rb', line 70

def method_missing(symbol, *args, &block)
  context = block ? -> { { symbol => block.call } } : { symbol => unwrap(args) }
  Context.new(self, context)
end

Instance Method Details

#add(severity, message = nil, context = nil, progname = nil, &block) ⇒ Object Also known as: log

Adds a new log message with the given severity



38
39
40
# File 'lib/mr_loga_loga/logger.rb', line 38

def add(severity, message = nil, context = nil, progname = nil, &block)
  write(severity, message, context, progname, &block)
end

#context(context = {}, &block) ⇒ Object

Generates a new context



32
33
34
35
# File 'lib/mr_loga_loga/logger.rb', line 32

def context(context = {}, &block)
  result = block ? -> { context.merge(block.call) } : context
  Context.new(self, result)
end

#log?(severity) ⇒ Boolean

Returns:

  • (Boolean)


79
80
81
# File 'lib/mr_loga_loga/logger.rb', line 79

def log?(severity)
  !@logdev.nil? && severity >= level
end

#respond_to_missing?(name, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


75
76
77
# File 'lib/mr_loga_loga/logger.rb', line 75

def respond_to_missing?(name, include_private = false)
  super(name, include_private)
end

#super_addObject



24
# File 'lib/mr_loga_loga/logger.rb', line 24

alias super_add add

#write(severity, *args, &block) ⇒ Object

Write the actual log data

This method needs to be used rather than add as various gems (Rails, Sidekiq) patch loggers to overwrite add. The patches’ signatures do not match our add method, so we use this method to do the actual logging in helper methods like debug, info etc.



48
49
50
51
52
53
54
55
56
# File 'lib/mr_loga_loga/logger.rb', line 48

def write(severity, *args, &block)
  severity ||= UNKNOWN
  return true unless log?(severity)

  message, context, progname = args
  log_message = message.is_a?(LogMessage) ? message : LogMessage.new(*LoggerData.build(message, context, &block))

  super_add(severity, log_message, progname)
end