[ruby/logger] Guarantee level_override exists

Some Ruby apps subclass Logger without running the superclass
constructor, which means that `@level_override` isn't initialized
properly. This can be fixed in some cases, but the gem should maintain
backwards compatibility.

https://github.com/ruby/logger/commit/3246f38328
This commit is contained in:
Michael Chui 2024-08-20 15:24:29 -07:00 committed by git
parent 1d68a735a2
commit 014708ad5a

View File

@ -381,7 +381,7 @@ class Logger
# Logging severity threshold (e.g. <tt>Logger::INFO</tt>).
def level
@level_override[Fiber.current] || @level
level_override[Fiber.current] || @level
end
# Sets the log level; returns +severity+.
@ -406,14 +406,14 @@ class Logger
# logger.debug { "Hello" }
# end
def with_level(severity)
prev, @level_override[Fiber.current] = level, Severity.coerce(severity)
prev, level_override[Fiber.current] = level, Severity.coerce(severity)
begin
yield
ensure
if prev
@level_override[Fiber.current] = prev
level_override[Fiber.current] = prev
else
@level_override.delete(Fiber.current)
level_override.delete(Fiber.current)
end
end
end
@ -746,6 +746,11 @@ private
SEV_LABEL[severity] || 'ANY'
end
# Guarantee the existence of this ivar even when subclasses don't call the superclass constructor.
def level_override
@level_override ||= {}
end
def format_message(severity, datetime, progname, msg)
(@formatter || @default_formatter).call(severity, datetime, progname, msg)
end