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
    def sql(event)
      info "#{event.payload[:name]} (#{event.duration}) #{event.payload[:sql]}"

And it’s finally registered as:

ActiveRecord::LogSubscriber.attach_to :active_record

Since we need to know all instance methods before attaching the log subscriber, the line above should be called after your ActiveRecord::LogSubscriber definition.

A logger also needs to be set with ActiveRecord::LogSubscriber.logger=. This 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(', ')} " \
        # standard logger code

Log subscriber also has some helpers to deal with logging and automatically flushes all logs when the request finishes (via action_dispatch.callback notification) in a Rails environment.


WHITE = "\e[37m"

CYAN = "\e[36m"

MAGENTA = "\e[35m"

BLUE = "\e[34m"

YELLOW = "\e[33m"

GREEN = "\e[32m"

RED = "\e[31m"

BLACK = "\e[30m"

BOLD = "\e[1m"

CLEAR = "\e[0m"


[W] logger
Show files where this class is defined (2 files)
Register or log in to add new notes.