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 |