Skip to content

Commit 2379bc5

Browse files
committed
Avoid using class var in LoggerThreadSafeLevel
Class variables are confusing and can be slow. In this case we were just using the class variable as a global to implement Fiber-local variables on top of. Instead we can use Thread#[] directly to store our Fiber-locals.
1 parent cce46f8 commit 2379bc5

File tree

1 file changed

+4
-12
lines changed

1 file changed

+4
-12
lines changed

activesupport/lib/active_support/logger_thread_safe_level.rb

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,6 @@ module ActiveSupport
99
module LoggerThreadSafeLevel # :nodoc:
1010
extend ActiveSupport::Concern
1111

12-
included do
13-
cattr_accessor :local_levels, default: Concurrent::Map.new(initial_capacity: 2), instance_accessor: false
14-
end
15-
1612
Logger::Severity.constants.each do |severity|
1713
class_eval(<<-EOT, __FILE__, __LINE__ + 1)
1814
def #{severity.downcase}? # def debug?
@@ -21,25 +17,21 @@ def #{severity.downcase}? # def debug?
2117
EOT
2218
end
2319

24-
def local_log_id
25-
Fiber.current.__id__
26-
end
27-
2820
def local_level
29-
self.class.local_levels[local_log_id]
21+
# Note: Thread#[] is fiber-local
22+
Thread.current[:logger_thread_safe_level]
3023
end
3124

3225
def local_level=(level)
3326
case level
3427
when Integer
35-
self.class.local_levels[local_log_id] = level
3628
when Symbol
37-
self.class.local_levels[local_log_id] = Logger::Severity.const_get(level.to_s.upcase)
29+
level = Logger::Severity.const_get(level.to_s.upcase)
3830
when nil
39-
self.class.local_levels.delete(local_log_id)
4031
else
4132
raise ArgumentError, "Invalid log level: #{level.inspect}"
4233
end
34+
Thread.current[:logger_thread_safe_level] = level
4335
end
4436

4537
def level

0 commit comments

Comments
 (0)