class Fancybox2::Logger::Multi

Log on multiple loggers at the same time

Usage example:

file_logger = Logger.new(File.open(“log/debug.log”, “a”)) stdout_logger = Logger.new(STDOUT) Create a logger that logs both to STDOUT and log_file at the same time with 'info' loglevel multi_logger = Fancybox2::Logger::Multi.new(file_logger, stdout_logger, level: :info))

Attributes

escape_data[RW]
level[RW]
loggers[RW]
progname[RW]

Public Class Methods

new(*args) click to toggle source

logger_1, logger_2, … , level: nil, loggers: nil, escape_data: true)

# File lib/fancybox2/logger/multi.rb, line 19
def initialize(*args)
  options = args.extract_options.deep_symbolize_keys
  loggers = args
  if !loggers.is_a?(Array) || loggers.size.zero?
    raise ArgumentError.new("provide at least one logger instance")
  end

  @level = normalize_log_level(options[:level])
  @escape_data = options[:escape_data] || false
  @progname = options[:progname]

  self.loggers = loggers
  # Set properties
  # Override Loggers levels only if explicitly required
  self.level = @level if options[:level] # Do not use @level because it has already been processed
  # Override Logger's Formatter only if explicitly required
  self.escape_data = @escape_data if @escape_data
  self.progname = @progname if @progname

  define_methods
end

Public Instance Methods

add(level, *args) click to toggle source
# File lib/fancybox2/logger/multi.rb, line 41
def add(level, *args)
  @loggers.each { |logger| logger.add(level, *args) }
end
Also aliased as: log
add_logger(logger) click to toggle source
# File lib/fancybox2/logger/multi.rb, line 46
def add_logger(logger)
  @loggers << logger
end
close() click to toggle source
# File lib/fancybox2/logger/multi.rb, line 50
def close
  @loggers.map(&:close)
end
default_log_level() click to toggle source
# File lib/fancybox2/logger/multi.rb, line 54
def default_log_level
  'info'
end
escape_data=(value) click to toggle source
# File lib/fancybox2/logger/multi.rb, line 58
def escape_data=(value)
  if value
    @loggers.each do |logger|
      escape_data_of logger
    end
  else
    @loggers.each { |logger| logger.formatter = ::Logger::Formatter.new }
  end
end
level=(level) click to toggle source
# File lib/fancybox2/logger/multi.rb, line 68
def level=(level)
  @level = normalize_log_level(level)
  @loggers.each { |logger| logger.level = level }
end
log(level, *args)
Alias for: add
loggers=(new_loggers) click to toggle source
# File lib/fancybox2/logger/multi.rb, line 73
def loggers=(new_loggers)
  @loggers = []
  new_loggers.each do |logger|
    # Check if provided loggers are real Loggers
    unless logger.is_a? ::Logger
      raise ArgumentError.new("one of the provided loggers is not of class Logger, but of class '#{logger.class}'")
    end
    # Add Logger to the list
    add_logger logger
  end
end
progname=(name) click to toggle source
# File lib/fancybox2/logger/multi.rb, line 85
def progname=(name)
  loggers.each do |logger|
    logger.progname = name
  end
end

Private Instance Methods

define_methods() click to toggle source
# File lib/fancybox2/logger/multi.rb, line 93
def define_methods
  ::Logger::Severity.constants.each do |level|
    define_singleton_method(level.downcase) do |args|
      @loggers.each { |logger| logger.add(normalize_log_level(level.downcase), *args) }
    end

    define_singleton_method("#{ level.downcase }?".to_sym) do
      @level <= ::Logger::Severity.const_get(level)
    end
  end
end
escape_data_of(logger) click to toggle source
# File lib/fancybox2/logger/multi.rb, line 105
def escape_data_of(logger)
  original_formatter = ::Logger::Formatter.new
  logger.formatter = proc do |severity, datetime, progname, msg|
    original_formatter.call(severity, datetime, progname, msg.dump)
  end
end
normalize_log_level(log_level) click to toggle source

@param [String] log_level

# File lib/fancybox2/logger/multi.rb, line 114
def normalize_log_level(log_level)
  case log_level
  when :unknown, ::Logger::UNKNOWN, 'unknown' then ::Logger::UNKNOWN
  when :debug,   ::Logger::DEBUG,   'debug'   then ::Logger::DEBUG
  when :info,    ::Logger::INFO,    'info'    then ::Logger::INFO
  when :warn,    ::Logger::WARN,    'warn'    then ::Logger::WARN
  when :error,   ::Logger::ERROR,   'error'   then ::Logger::ERROR
  when :fatal,   ::Logger::FATAL,   'fatal'   then ::Logger::FATAL
  else
    # puts "Fancybox2::Logger::Multi#normalize_log_level, log_level value '#{log_level.inspect}' not supported, defaulting to '#{default_log_level}'"
    normalize_log_level(default_log_level)
  end
end