class SmartLoggerWrapper

Constants

BASE_OFFSET
DELEGETING_METHODS
NESTED_WRAPPER_OFFSET
SEVERITY_MAPPING
VERSION

Attributes

base_offset[R]
loggers[R]
options[R]
parent[R]

Public Class Methods

new(logger = Logger.new(STDOUT), *loggers, base_offset: nil, parent: nil, **options) click to toggle source
# File lib/smart_logger_wrapper.rb, line 23
def initialize(logger = Logger.new(STDOUT), *loggers, base_offset: nil, parent: nil, **options)
  @base_offset = base_offset || BASE_OFFSET
  @parent = parent
  @loggers = be_parent_of!(logger, *loggers).freeze
  @options = options.freeze
  @_loggers_cache = {}
end

Public Instance Methods

depth() click to toggle source
# File lib/smart_logger_wrapper.rb, line 57
def depth
  return 0 if root?
  parent.depth + 1
end
format_message(severity, datetime, progname, msg) click to toggle source
# File lib/smart_logger_wrapper.rb, line 66
def format_message(severity, datetime, progname, msg)
  loggers.first.send(:format_message, severity, datetime, progname, msg)
end
format_severity(severity) click to toggle source
# File lib/smart_logger_wrapper.rb, line 62
def format_severity(severity)
  loggers.first.send(:format_severity, severity)
end
offset() click to toggle source
# File lib/smart_logger_wrapper.rb, line 53
def offset
  @base_offset + depth * NESTED_WRAPPER_OFFSET
end
with_option(option_name, *args) click to toggle source
# File lib/smart_logger_wrapper.rb, line 70
def with_option(option_name, *args)
  new_options = options.merge(option_name => args)
  self.class.new(*loggers, base_offset: base_offset, parent: parent, **new_options)
end

Private Instance Methods

be_parent_of!(*loggers) click to toggle source
# File lib/smart_logger_wrapper.rb, line 111
def be_parent_of!(*loggers)
  loggers.each do |logger|
    # XXX: Calling a private method because it is an internal procedure
    logger.is_a?(SmartLoggerWrapper) ? logger.send(:set_parent!, self) : logger
  end
end
build_messages(severity, *args, &block) click to toggle source
# File lib/smart_logger_wrapper.rb, line 77
  def build_messages(severity, *args, &block)
    messages = args.map { |arg| to_message(arg) }
    messages << to_message(block.call) if block_given?
    begin
      Options.apply_all!(messages, severity, self)
    rescue Options::ApplicationError => e
      loggers.each do |logger|
        logger.error(<<~EOM)
          Failed to apply options: #{e.inspect}
          #{e.backtrace.join("\n")}
        EOM
      end
    end
    messages
  end
method_missing(method_name, *args, &block) click to toggle source
Calls superclass method
# File lib/smart_logger_wrapper.rb, line 122
def method_missing(method_name, *args, &block)
  if root? && Options.defined_option?(method_name)
    # When a root wrapper receives an defined option with the same name as the method name,
    # return a new logger wrapper with the option.
    @_loggers_cache[method_name] = {} unless @_loggers_cache.include?(method_name)
    logger_with_option = @_loggers_cache[method_name][args] ||= with_option(method_name, *args)
    return block.(logger_with_option) if block_given?
    logger_with_option
  else
    super
  end
end
respond_to_missing?(method_name, includes_private) click to toggle source
Calls superclass method
# File lib/smart_logger_wrapper.rb, line 135
def respond_to_missing?(method_name, includes_private)
  root? && Options.defined_option?(method_name) || super
end
root?() click to toggle source
# File lib/smart_logger_wrapper.rb, line 118
def root?
  parent == nil
end
set_parent!(new_parent) click to toggle source
# File lib/smart_logger_wrapper.rb, line 106
def set_parent!(new_parent)
  @_loggers_cache.clear if new_parent != nil
  @parent = new_parent == self ? nil : new_parent # to avoid stack overflow at #depth
end
to_message(object) click to toggle source
# File lib/smart_logger_wrapper.rb, line 93
def to_message(object)
  case object
  when String
    object
  when Exception
    backtrace = object.backtrace ? Utils::Backtrace.clean_backtrace(object.backtrace) : []
    info = [object.inspect]
    (info + backtrace).join("\n")
  else
    object.inspect
  end
end