summaryrefslogtreecommitdiff
path: root/lib/logger.rb
diff options
context:
space:
mode:
authorMichael Chui <[email protected]>2024-08-20 15:24:29 -0700
committergit <[email protected]>2024-08-21 01:10:56 +0000
commit014708ad5a84b454d16e532f48476d2760ea5b56 (patch)
tree575504dc43f2ac80e5dd94db5a0ee8c2837d3038 /lib/logger.rb
parent1d68a735a262dba3d6222cfd664b80db2a33fc60 (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.rb13
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