aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/logger_silence.rb
diff options
context:
space:
mode:
authorCarl P. Corliss <rabbitt@gmail.com>2015-06-09 22:38:53 -0400
committerCarl P. Corliss <rabbitt@gmail.com>2015-12-23 12:57:33 -0500
commit629efb605728b31ad9644f6f0acaf3760b641a29 (patch)
tree78f05d8972b8d3ef5d716a3078b91a80130d3ecb /activesupport/lib/active_support/logger_silence.rb
parent2ad6deb5344abd77515f1c04edbd586a5538f705 (diff)
downloadrails-629efb605728b31ad9644f6f0acaf3760b641a29.tar.gz
rails-629efb605728b31ad9644f6f0acaf3760b641a29.tar.bz2
rails-629efb605728b31ad9644f6f0acaf3760b641a29.zip
Fixes LoggerSilence#silence threadsafety
- uses instance defined level if no custom local log level defined - Keeps track of local log level per [ thread + object-instance ] - prevents memory leakage by removing local level hash key/value on #silence method exit - avoids the use of Thread local variables
Diffstat (limited to 'activesupport/lib/active_support/logger_silence.rb')
-rw-r--r--activesupport/lib/active_support/logger_silence.rb24
1 files changed, 22 insertions, 2 deletions
diff --git a/activesupport/lib/active_support/logger_silence.rb b/activesupport/lib/active_support/logger_silence.rb
index 7d92256f24..690e5596f7 100644
--- a/activesupport/lib/active_support/logger_silence.rb
+++ b/activesupport/lib/active_support/logger_silence.rb
@@ -1,22 +1,42 @@
require 'active_support/concern'
require 'active_support/core_ext/module/attribute_accessors'
+require 'concurrent'
module LoggerSilence
extend ActiveSupport::Concern
included do
cattr_accessor :silencer
+ attr_reader :local_levels
self.silencer = true
end
+ def after_initialize
+ @local_levels = Concurrent::Map.new(:initial_capacity => 2)
+ end
+
+ def local_log_id
+ Thread.current.__id__
+ end
+
+ def level
+ local_levels[local_log_id] || super
+ end
+
# Silences the logger for the duration of the block.
def silence(temporary_level = Logger::ERROR)
if silencer
begin
- old_logger_level, self.level = level, temporary_level
+ old_local_level = local_levels[local_log_id]
+ local_levels[local_log_id] = temporary_level
+
yield self
ensure
- self.level = old_logger_level
+ if old_local_level
+ local_levels[local_log_id] = old_local_level
+ else
+ local_levels.delete(local_log_id)
+ end
end
else
yield self