From 457612839344d761f143e1ab2d8eea551b76efe2 Mon Sep 17 00:00:00 2001 From: nick evans Date: Wed, 1 Oct 2025 11:35:06 -0400 Subject: [PATCH] Use ObjectSpace::WeakKeyMap for level_override This allows fiber keys to be GCed and removed from the map. Otherwise, fibers that call `#with_level` create a memory leak if they are killed without running their ensure blocks. --- lib/logger.rb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/logger.rb b/lib/logger.rb index be00457..d9d1dcd 100644 --- a/lib/logger.rb +++ b/lib/logger.rb @@ -379,6 +379,14 @@ class Logger include Severity + # Must respond to .new and return a Hash-like object. + # The returned object must respond to #[], #[]=, #delete. + # + # ObjectSpace::WeakKeyMap when supported. + OverrideMap = + defined?(ObjectSpace::WeakKeyMap) ? ObjectSpace::WeakKeyMap : Hash + private_constant :OverrideMap + # Logging severity threshold (e.g. Logger::INFO). def level level_override[level_key] || @level @@ -606,7 +614,7 @@ def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG, self.datetime_format = datetime_format self.formatter = formatter @logdev = nil - @level_override = {} + @level_override = OverrideMap.new return unless logdev case logdev when File::NULL @@ -789,7 +797,7 @@ def level_override does not call super probably ;;; end - @level_override ||= {} + @level_override ||= OverrideMap.new end def level_key