Last active
April 15, 2016 18:39
-
-
Save rabbitt/5247188b03f8d92cd7214362022979c6 to your computer and use it in GitHub Desktop.
ActiveSupport threadsafe logger patch for v3.2.22.1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -Nabur ./benchmarkable.rb /Users/rabbitt/work/repos/rails/activesupport/lib/active_support/benchmarkable.rb | |
--- ./benchmarkable.rb 2016-04-15 14:38:20.000000000 -0400 | |
+++ /Users/rabbitt/work/repos/rails/activesupport/lib/active_support/benchmarkable.rb 2016-04-15 13:43:10.000000000 -0400 | |
@@ -46,10 +46,11 @@ | |
# Silence the logger during the execution of the block. | |
# | |
def silence | |
- old_logger_level, logger.level = logger.level, ::Logger::ERROR if logger | |
+ if logger | |
+ logger.silence(::Logger::ERROR) { yield } | |
+ else | |
yield | |
- ensure | |
- logger.level = old_logger_level if logger | |
+ end | |
end | |
end | |
end | |
diff -Nabur ./buffered_logger.rb /Users/rabbitt/work/repos/rails/activesupport/lib/active_support/buffered_logger.rb | |
--- ./buffered_logger.rb 2016-04-15 14:38:20.000000000 -0400 | |
+++ /Users/rabbitt/work/repos/rails/activesupport/lib/active_support/buffered_logger.rb 2016-04-15 13:44:11.000000000 -0400 | |
@@ -28,18 +28,8 @@ | |
# Silences the logger for the duration of the block. | |
def silence(temporary_level = ERROR) | |
- if silencer | |
- begin | |
- logger = self.class.new @log_dest.dup, temporary_level | |
- yield logger | |
- ensure | |
- logger.close | |
+ @log.silence(temporary_level) { yield } | |
end | |
- else | |
- yield self | |
- end | |
- end | |
- deprecate :silence | |
attr_reader :auto_flushing | |
deprecate :auto_flushing | |
diff -Nabur ./concurrency/latch.rb /Users/rabbitt/work/repos/rails/activesupport/lib/active_support/concurrency/latch.rb | |
--- ./concurrency/latch.rb 1969-12-31 19:00:00.000000000 -0500 | |
+++ /Users/rabbitt/work/repos/rails/activesupport/lib/active_support/concurrency/latch.rb 2016-04-15 12:51:23.000000000 -0400 | |
@@ -0,0 +1,27 @@ | |
+require 'thread' | |
+require 'monitor' | |
+ | |
+module ActiveSupport | |
+ module Concurrency | |
+ class Latch | |
+ def initialize(count = 1) | |
+ @count = count | |
+ @lock = Monitor.new | |
+ @cv = @lock.new_cond | |
+ end | |
+ | |
+ def release | |
+ @lock.synchronize do | |
+ @count -= 1 if @count > 0 | |
+ @cv.broadcast if @count.zero? | |
+ end | |
+ end | |
+ | |
+ def await | |
+ @lock.synchronize do | |
+ @cv.wait_while { @count > 0 } | |
+ end | |
+ end | |
+ end | |
+ end | |
+end | |
diff -Nabur ./core_ext/logger.rb /Users/rabbitt/work/repos/rails/activesupport/lib/active_support/core_ext/logger.rb | |
--- ./core_ext/logger.rb 2016-04-15 14:38:20.000000000 -0400 | |
+++ /Users/rabbitt/work/repos/rails/activesupport/lib/active_support/core_ext/logger.rb 2016-04-15 14:02:30.000000000 -0400 | |
@@ -17,6 +17,7 @@ | |
end | |
require 'logger' | |
+require 'thread_safe' | |
# Extensions to the built-in Ruby logger. | |
# | |
@@ -36,21 +37,7 @@ | |
# Set to false to disable the silencer | |
cattr_accessor :silencer | |
self.silencer = true | |
- | |
- # 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 | |
- yield self | |
- ensure | |
- self.level = old_logger_level | |
- end | |
- else | |
- yield self | |
- end | |
- end | |
- deprecate :silence | |
+ attr_reader :local_levels | |
alias :old_datetime_format= :datetime_format= | |
# Logging date-time format (string passed to +strftime+). Ignored if the formatter | |
@@ -68,11 +55,57 @@ | |
alias :old_initialize :initialize | |
# Overwrite initialize to set a default formatter. | |
+ | |
def initialize(*args) | |
old_initialize(*args) | |
self.formatter = SimpleFormatter.new | |
+ @local_levels = ThreadSafe::Cache.new(:initial_capacity => 2) | |
+ end | |
+ | |
+ alias_method :old_add, :add | |
+ def add(severity, message = nil, progname = nil, &block) | |
+ return true if @logdev.nil? || (severity || UNKNOWN) < level | |
+ old_add(severity, message, progname, &block) | |
+ end | |
+ | |
+ Logger::Severity.constants.each do |severity| | |
+ class_eval(<<-EOT, __FILE__, __LINE__ + 1) | |
+ undef :#{severity.downcase}? if method_defined? :#{severity.downcase}? | |
+ def #{severity.downcase}? # def debug? | |
+ Logger::#{severity} >= level # DEBUG >= level | |
+ end # end | |
+ EOT | |
+ end | |
+ | |
+ def local_log_id | |
+ Thread.current.__id__ | |
+ end | |
+ | |
+ def level | |
+ local_levels[local_log_id] || @level | |
end | |
+ # Silences the logger for the duration of the block. | |
+ def silence(temporary_level = Logger::ERROR) | |
+ if silencer | |
+ begin | |
+ old_local_level = local_levels[local_log_id] | |
+ local_levels[local_log_id] = temporary_level | |
+ | |
+ yield self | |
+ ensure | |
+ if old_local_level | |
+ local_levels[local_log_id] = old_local_level | |
+ else | |
+ local_levels.delete(local_log_id) | |
+ end | |
+ end | |
+ else | |
+ yield self | |
+ end | |
+ end | |
+ deprecate :silence | |
+ | |
# Simple formatter which only displays the message. | |
class SimpleFormatter < Logger::Formatter | |
# This method is invoked when a log event occurs |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment