mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
2518bda97c
Fix #23609
Commit 629efb6
introduced thread safety to logger silencing but it
didn't take into account the fact that the logger can be extended with
broadcasting to other logger.
This commit introduces local_level to broadcasting Module which enables
broadcasted loggers to be properly silenced.
88 lines
2.4 KiB
Ruby
88 lines
2.4 KiB
Ruby
require 'active_support/logger_silence'
|
|
require 'active_support/logger_thread_safe_level'
|
|
require 'logger'
|
|
|
|
module ActiveSupport
|
|
class Logger < ::Logger
|
|
include ActiveSupport::LoggerThreadSafeLevel
|
|
include LoggerSilence
|
|
|
|
# Returns true if the logger destination matches one of the sources
|
|
#
|
|
# logger = Logger.new(STDOUT)
|
|
# ActiveSupport::Logger.logger_outputs_to?(logger, STDOUT)
|
|
# # => true
|
|
def self.logger_outputs_to?(logger, *sources)
|
|
logdev = logger.instance_variable_get("@logdev")
|
|
logger_source = logdev.dev if logdev.respond_to?(:dev)
|
|
sources.any? { |source| source == logger_source }
|
|
end
|
|
|
|
# Broadcasts logs to multiple loggers.
|
|
def self.broadcast(logger) # :nodoc:
|
|
Module.new do
|
|
define_method(:add) do |*args, &block|
|
|
logger.add(*args, &block)
|
|
super(*args, &block)
|
|
end
|
|
|
|
define_method(:<<) do |x|
|
|
logger << x
|
|
super(x)
|
|
end
|
|
|
|
define_method(:close) do
|
|
logger.close
|
|
super()
|
|
end
|
|
|
|
define_method(:progname=) do |name|
|
|
logger.progname = name
|
|
super(name)
|
|
end
|
|
|
|
define_method(:formatter=) do |formatter|
|
|
logger.formatter = formatter
|
|
super(formatter)
|
|
end
|
|
|
|
define_method(:level=) do |level|
|
|
logger.level = level
|
|
super(level)
|
|
end
|
|
|
|
define_method(:local_level=) do |level|
|
|
logger.local_level = level if logger.respond_to?(:local_level=)
|
|
super(level) if respond_to?(:local_level=)
|
|
end
|
|
end
|
|
end
|
|
|
|
def initialize(*args)
|
|
super
|
|
@formatter = SimpleFormatter.new
|
|
after_initialize if respond_to? :after_initialize
|
|
end
|
|
|
|
def add(severity, message = nil, progname = nil, &block)
|
|
return true if @logdev.nil? || (severity || UNKNOWN) < level
|
|
super
|
|
end
|
|
|
|
Logger::Severity.constants.each do |severity|
|
|
class_eval(<<-EOT, __FILE__, __LINE__ + 1)
|
|
def #{severity.downcase}? # def debug?
|
|
Logger::#{severity} >= level # DEBUG >= level
|
|
end # end
|
|
EOT
|
|
end
|
|
|
|
# Simple formatter which only displays the message.
|
|
class SimpleFormatter < ::Logger::Formatter
|
|
# This method is invoked when a log event occurs
|
|
def call(severity, timestamp, progname, msg)
|
|
"#{String === msg ? msg : msg.inspect}\n"
|
|
end
|
|
end
|
|
end
|
|
end
|