Added thread-safe log silencer - closes #105

Andrew Kane committed Jun 02, 2015
commit defc47ebd492e1b40b1b84a344d930dec6060485
Showing 3 changed files with 89 additions and 8 deletions
ahoy.rb b/lib/ahoy.rb +8 -0
@@ @@ -24,6 +24,7 @@ require "ahoy/stores/active_record_token_store"
require "ahoy/stores/log_store"
require "ahoy/stores/fluentd_store"
require "ahoy/stores/mongoid_store"
+ require "ahoy/logger_silencer"
require "ahoy/engine"
require "ahoy/warden" if defined?(Warden)
@@ @@ -83,3 +84,10 @@ end
ActionController::Base.send :include, Ahoy::Controller
ActiveRecord::Base.send(:extend, Ahoy::Model) if defined?(ActiveRecord)
+
+ Logger.send :include, Ahoy::LoggerSilencer
+
+ begin
+ require "syslog/logger"
+ Syslog::Logger.send :include, Ahoy::LoggerSilencer
+ rescue LoadError; end
ahoy/engine.rb b/lib/ahoy/engine.rb +8 -8
@@ @@ -5,19 +5,19 @@ module Ahoy
next unless Ahoy.quiet
# Parse PATH_INFO by assets prefix
- AHOY_PREFIX = "/ahoy/"
- KEY = "ahoy.old_level"
+ AHOY_PREFIX = "/ahoy/".freeze
+ KEY = "ahoy.old_level".freeze
# Just create an alias for call in middleware
Rails::Rack::Logger.class_eval do
def call_with_quiet_ahoy(env)
- if env["PATH_INFO"].start_with?(AHOY_PREFIX)
- env[KEY] = Rails.logger.level
- Rails.logger.level = Logger::ERROR
+ if env["PATH_INFO"].start_with?(AHOY_PREFIX) && logger.respond_to?(:silence_logger)
+ logger.silence_logger do
+ call_without_quiet_ahoy(env)
+ end
+ else
+ call_without_quiet_ahoy(env)
end
- call_without_quiet_ahoy(env)
- ensure
- Rails.logger.level = env[KEY] if env[KEY]
end
alias_method_chain :call, :quiet_ahoy
end
ahoy/logger_silencer.rb b/lib/ahoy/logger_silencer.rb +73 -0
@@ @@ -0,0 +1,73 @@
+ # from https://github.com/rails/activerecord-session_store/blob/master/lib/active_record/session_store/extension/logger_silencer.rb
+ require "thread"
+ require "active_support/core_ext/class/attribute_accessors"
+ require "active_support/core_ext/module/aliasing"
+ require "active_support/core_ext/module/attribute_accessors"
+ require "active_support/concern"
+
+ module Ahoy
+ module LoggerSilencer
+ extend ActiveSupport::Concern
+
+ included do
+ cattr_accessor :silencer
+ self.silencer = true
+ alias_method_chain :level, :threadsafety
+ alias_method_chain :add, :threadsafety
+ end
+
+ def thread_level
+ Thread.current[thread_hash_level_key]
+ end
+
+ def thread_level=(level)
+ Thread.current[thread_hash_level_key] = level
+ end
+
+ def level_with_threadsafety
+ thread_level || level_without_threadsafety
+ end
+
+ def add_with_threadsafety(severity, message = nil, progname = nil, &block)
+ if !defined?(@logdev) || @logdev.nil? || (severity || UNKNOWN) < level
+ true
+ else
+ add_without_threadsafety(severity, message, progname, &block)
+ end
+ end
+
+ # Silences the logger for the duration of the block.
+ def silence_logger(temporary_level = Logger::ERROR)
+ if silencer
+ begin
+ self.thread_level = temporary_level
+ yield self
+ ensure
+ self.thread_level = nil
+ end
+ else
+ yield self
+ end
+ end
+
+ for severity in Logger::Severity.constants
+ class_eval <<-EOT, __FILE__, __LINE__ + 1
+ def #{severity.downcase}? # def debug?
+ Logger::#{severity} >= level # DEBUG >= level
+ end # end
+ EOT
+ end
+
+ private
+
+ def thread_hash_level_key
+ @thread_hash_level_key ||= :"ThreadSafeLogger##{object_id}@level"
+ end
+ end
+ end
+
+ class NilLogger
+ def self.silence_logger
+ yield
+ end
+ end