Skip to content

Instantly share code, notes, and snippets.

@ahmed-bacha
Forked from clowder/multi_logger.rb
Created October 12, 2016 19:28
Show Gist options
  • Save ahmed-bacha/a5adab9be00263e1ce86c7fca8c4d663 to your computer and use it in GitHub Desktop.
Save ahmed-bacha/a5adab9be00263e1ce86c7fca8c4d663 to your computer and use it in GitHub Desktop.
Logging to multiple destinations in Ruby
class MultiLogger
attr_reader :level
def initialize(args={})
@level = args[:level] || Logger::Severity::DEBUG
@loggers = []
Array(args[:loggers]).each { |logger| add_logger(logger) }
end
def add_logger(logger)
logger.level = level
@loggers << logger
end
def level=(level)
@level = level
@loggers.each { |logger| logger.level = level }
end
def close
@loggers.map(&:close)
end
def add(level, *args)
@loggers.each { |logger| logger.add(level, args) }
end
Logger::Severity.constants.each do |level|
define_method(level.downcase) do |*args|
@loggers.each { |logger| logger.send(level.downcase, args) }
end
define_method("#{ level.downcase }?".to_sym) do
@level <= Logger::Severity.const_get(level)
end
end
end
log_1 = Logger.new(STDOUT)
log_2 = Logger.new(File.open('/tmp/foo'))
multi_logger = MultiLogger.new(:level => Logger::WARN, :loggers => log_1)
multi_logger.add_logger(log_2)
multi_logger.warn('Something interesting happened.')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment