Skip to content

Instantly share code, notes, and snippets.

@clowder
Created September 5, 2012 16:40
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save clowder/3639600 to your computer and use it in GitHub Desktop.
Save clowder/3639600 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.')
@canton7
Copy link

canton7 commented Nov 26, 2012

Line 31 should be *args, not args

@barberj
Copy link

barberj commented Jun 10, 2015

Thanks for the gist. Couldn't find a gem version https://github.com/barberj/omni_logger

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment