Project

General

Profile

Download (1.23 KB) Statistics
| Branch: | Tag: | Revision:
# Wrap a ::Logging::Logger and implement #silence to temporarily increase the
# min log level to execute a block of code. Used by sprockets-rails' quiet
# assets logging feature. Foreman uses logging gem instead Rails logging stack
# and it does not provide silencing feature (ships with just a noop method).
# This implementation only works with Logging gem, not with Ruby/Rails Logger.
#
# Inspired by lib/active_record/session_store/extension/logger_silencer.rb
#
module Foreman
class SilencedLogger < SimpleDelegator
::Logging::LEVELS.each do |name, num|
class_eval <<-EOT, __FILE__, __LINE__ + 1
def #{name.downcase}?
#{num} >= local_level
end

def #{name.downcase}(*args)
super(*args) if #{num} >= local_level
end
EOT
end

def level_key
@level_key ||= :"SilencedLogger##{object_id}@level"
end

def local_level
Thread.current[level_key] || self.level
end

def local_level=(level)
Thread.current[level_key] = level
end

def silence(temporary_level = Logger::ERROR, &block)
self.local_level = temporary_level
yield self
ensure
self.local_level = nil
end
alias_method :silence_logger, :silence
end
end
(12-12/14)