diff options
author | Michael Chui <[email protected]> | 2024-08-20 15:24:29 -0700 |
---|---|---|
committer | git <[email protected]> | 2024-08-21 01:10:56 +0000 |
commit | 014708ad5a84b454d16e532f48476d2760ea5b56 (patch) | |
tree | 575504dc43f2ac80e5dd94db5a0ee8c2837d3038 /lib/logger.rb | |
parent | 1d68a735a262dba3d6222cfd664b80db2a33fc60 (diff) |
[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
Diffstat (limited to 'lib/logger.rb')
-rw-r--r-- | lib/logger.rb | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/logger.rb b/lib/logger.rb index 4a9c81b72b..63179ec671 100644 --- a/lib/logger.rb +++ b/lib/logger.rb @@ -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 |