Skip to content

Commit 5f37f2b

Browse files
committed
Clear level overrides in #dup and #clone
Cloning loggers can be used, for example, to create different loggers for different classes/components/subsystems that share the same log_dev and other configuration (possibly a subclass of Logger), but with different verbosity levels, formatters, etc. But, that doesn't work if they share `@level_override`. Rather than use OverrideMap.new, the existing `@level_override` is cloned and cleared, to preserve `@level_override`'s class.
1 parent 4576128 commit 5f37f2b

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

lib/logger.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ class Logger
380380
include Severity
381381

382382
# Must respond to .new and return a Hash-like object.
383-
# The returned object must respond to #[], #[]=, #delete.
383+
# The returned object must respond to #[], #[]=, #delete, #dup, and #clear.
384384
#
385385
# ObjectSpace::WeakKeyMap when supported.
386386
OverrideMap =
@@ -800,6 +800,11 @@ def level_override
800800
@level_override ||= OverrideMap.new
801801
end
802802

803+
def initialize_copy(other)
804+
super
805+
@level_override = @level_override&.clone&.clear
806+
end
807+
803808
def level_key
804809
Fiber.current
805810
end

test/logger/test_severity.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ def test_fiber_local_level
3636
logger.with_level(:WARN) do
3737
assert_equal(other.level, ERROR)
3838
assert_equal(logger.level, WARN)
39+
assert_equal(logger.dup.level, INFO)
40+
assert_equal(logger.clone.level, INFO)
41+
logger.clone.with_level(:FATAL) do
42+
assert_equal(logger.level, WARN)
43+
end
3944

4045
logger.with_level(DEBUG) do # verify reentrancy
4146
assert_equal(logger.level, DEBUG)
@@ -45,6 +50,8 @@ def test_fiber_local_level
4550
logger.with_level(:WARN) do
4651
assert_equal(other.level, ERROR)
4752
assert_equal(logger.level, WARN)
53+
assert_equal(logger.dup.level, INFO)
54+
assert_equal(logger.clone.level, INFO)
4855
end
4956
assert_equal(logger.level, INFO)
5057
end.resume
@@ -72,6 +79,11 @@ def level_key
7279
logger.with_level(:WARN) do
7380
assert_equal(other.level, ERROR)
7481
assert_equal(logger.level, WARN)
82+
assert_equal(logger.dup.level, INFO)
83+
assert_equal(logger.clone.level, INFO)
84+
logger.clone.with_level(:FATAL) do
85+
assert_equal(logger.level, WARN)
86+
end
7587

7688
logger.with_level(DEBUG) do # verify reentrancy
7789
assert_equal(logger.level, DEBUG)
@@ -81,6 +93,8 @@ def level_key
8193
logger.with_level(:WARN) do
8294
assert_equal(other.level, ERROR)
8395
assert_equal(logger.level, WARN)
96+
assert_equal(logger.dup.level, INFO)
97+
assert_equal(logger.clone.level, INFO)
8498
end
8599
assert_equal(logger.level, DEBUG)
86100
end.resume

0 commit comments

Comments
 (0)