Class: ActiveSupport::TaggedLogging

Inherits:
Object
  • Object
show all
Defined in:
lib/active_support/tagged_logging.rb

Overview

Wraps any standard Logger class to provide tagging capabilities. Examples:

Logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
Logger.tagged("BCX") { Logger.info "Stuff" }                            # Logs "[BCX] Stuff"
Logger.tagged("BCX", "Jason") { Logger.info "Stuff" }                   # Logs "[BCX] [Jason] Stuff"
Logger.tagged("BCX") { Logger.tagged("Jason") { Logger.info "Stuff" } } # Logs "[BCX] [Jason] Stuff"

This is used by the default Rails.logger as configured by Railties to make it easy to stamp log lines with subdomains, request ids, and anything else to aid debugging of multi-user production applications.

Instance Method Summary collapse

Constructor Details

#initialize(logger) ⇒ TaggedLogging

Returns a new instance of TaggedLogging.



16
17
18
19
# File 'lib/active_support/tagged_logging.rb', line 16

def initialize(logger)
  @logger = logger
  @tags   = Hash.new { |h,k| h[k] = [] }
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args) ⇒ Object



53
54
55
# File 'lib/active_support/tagged_logging.rb', line 53

def method_missing(method, *args)
  @logger.send(method, *args)
end

Instance Method Details

#add(severity, message = nil, progname = nil, &block) ⇒ Object



35
36
37
38
# File 'lib/active_support/tagged_logging.rb', line 35

def add(severity, message = nil, progname = nil, &block)
  message = (block_given? ? block.call : progname) if message.nil?
  @logger.add(severity, "#{tags_text}#{message}", progname)
end

#flushObject



48
49
50
51
# File 'lib/active_support/tagged_logging.rb', line 48

def flush
  @tags.delete(Thread.current)
  @logger.flush if @logger.respond_to?(:flush)
end

#silence(temporary_level = Logger::ERROR, &block) ⇒ Object



30
31
32
# File 'lib/active_support/tagged_logging.rb', line 30

def silence(temporary_level = Logger::ERROR, &block)
  @logger.silence(temporary_level, &block)
end

#tagged(*new_tags) ⇒ Object



21
22
23
24
25
26
27
28
# File 'lib/active_support/tagged_logging.rb', line 21

def tagged(*new_tags)
  tags     = current_tags
  new_tags = Array.wrap(new_tags).flatten.reject(&:blank?)
  tags.concat new_tags
  yield
ensure
  new_tags.size.times { tags.pop }
end