Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save rabbitt/5247188b03f8d92cd7214362022979c6 to your computer and use it in GitHub Desktop.
Save rabbitt/5247188b03f8d92cd7214362022979c6 to your computer and use it in GitHub Desktop.
ActiveSupport threadsafe logger patch for v3.2.22.1
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