Class: ActiveSupport::LogSubscriber
- Inherits:
-
Subscriber
- Object
- Subscriber
- ActiveSupport::LogSubscriber
- Includes:
- ColorizeLogging
- Defined in:
- activesupport/lib/active_support/log_subscriber.rb,
activesupport/lib/active_support/log_subscriber/test_helper.rb
Overview
Active Support Log Subscriber
ActiveSupport::LogSubscriber is an object set to consume ActiveSupport::Notifications with the sole purpose of logging them. The log subscriber dispatches notifications to a registered object based on its given namespace.
An example would be Active Record log subscriber responsible for logging queries:
module ActiveRecord
class LogSubscriber < ActiveSupport::LogSubscriber
attach_to :active_record
def sql(event)
info "#{event.payload[:name]} (#{event.duration}) #{event.payload[:sql]}"
end
end
end
ActiveRecord::LogSubscriber.logger must be set as well, but it is assigned automatically in a Rails environment.
After configured, whenever a "sql.active_record" notification is published, it will properly dispatch the event (ActiveSupport::Notifications::Event) to the sql method.
Being an ActiveSupport::Notifications consumer, ActiveSupport::LogSubscriber exposes a simple interface to check if instrumented code raises an exception. It is common to log a different message in case of an error, and this can be achieved by extending the previous example:
module ActiveRecord
class LogSubscriber < ActiveSupport::LogSubscriber
def sql(event)
exception = event.payload[:exception]
if exception
exception_object = event.payload[:exception_object]
error "[ERROR] #{event.payload[:name]}: #{exception.join(', ')} " \
"(#{exception_object.backtrace.first})"
else
# standard logger code
end
end
end
end
ActiveSupport::LogSubscriber also has some helpers to deal with logging. For example, ActiveSupport::LogSubscriber.flush_all! will ensure that all logs are flushed, and it is called in Rails::Rack::Logger after a request finishes.
Direct Known Subclasses
Defined Under Namespace
Modules: TestHelper
Constant Summary collapse
- LEVEL_CHECKS =
{ debug: -> (logger) { !logger.debug? }, info: -> (logger) { !logger.info? }, error: -> (logger) { !logger.error? }, }
Constants included from ColorizeLogging
ColorizeLogging::BLACK, ColorizeLogging::BLUE, ColorizeLogging::CYAN, ColorizeLogging::GREEN, ColorizeLogging::MAGENTA, ColorizeLogging::MODES, ColorizeLogging::RED, ColorizeLogging::WHITE, ColorizeLogging::YELLOW
Class Attribute Summary collapse
Instance Attribute Summary collapse
-
#event_levels ⇒ Object
writeonly
:nodoc:.
Attributes inherited from Subscriber
Class Method Summary collapse
-
.attach_to ⇒ Object
:nodoc:.
-
.flush_all! ⇒ Object
Flush all log_subscribers’ logger.
- .log_subscribers ⇒ Object
Instance Method Summary collapse
- #call(event) ⇒ Object
-
#initialize ⇒ LogSubscriber
constructor
A new instance of LogSubscriber.
- #logger ⇒ Object
- #silenced?(event) ⇒ Boolean
Methods included from ColorizeLogging
#color, #colorize_logging, #debug, #error, #fatal, #info, #mode_from, #unknown, #warn
Methods included from Concern
#append_features, #class_methods, extended, #included, #prepend_features, #prepended
Methods inherited from Subscriber
detach_from, method_added, subscribers
Constructor Details
#initialize ⇒ LogSubscriber
Returns a new instance of LogSubscriber.
120 121 122 123 |
# File 'activesupport/lib/active_support/log_subscriber.rb', line 120 def initialize super @event_levels = {} end |
Class Attribute Details
Instance Attribute Details
#event_levels=(value) ⇒ Object (writeonly)
:nodoc:
135 136 137 |
# File 'activesupport/lib/active_support/log_subscriber.rb', line 135 def event_levels=(value) @event_levels = value end |
Class Method Details
.attach_to ⇒ Object
:nodoc:
84 85 86 87 88 |
# File 'activesupport/lib/active_support/log_subscriber.rb', line 84 def attach_to(...) # :nodoc: result = super set_event_levels result end |
.flush_all! ⇒ Object
Flush all log_subscribers’ logger.
95 96 97 |
# File 'activesupport/lib/active_support/log_subscriber.rb', line 95 def flush_all! logger.flush if logger.respond_to?(:flush) end |
.log_subscribers ⇒ Object
90 91 92 |
# File 'activesupport/lib/active_support/log_subscriber.rb', line 90 def log_subscribers subscribers end |
Instance Method Details
#call(event) ⇒ Object
129 130 131 132 133 |
# File 'activesupport/lib/active_support/log_subscriber.rb', line 129 def call(event) super if logger rescue => e log_exception(event.name, e) end |
#logger ⇒ Object
116 117 118 |
# File 'activesupport/lib/active_support/log_subscriber.rb', line 116 def logger LogSubscriber.logger end |
#silenced?(event) ⇒ Boolean
125 126 127 |
# File 'activesupport/lib/active_support/log_subscriber.rb', line 125 def silenced?(event) logger.nil? || @event_levels[event]&.call(logger) end |