Class: ActiveSupport::TaggedLogging

Inherits:
Object
  • Object
show all
Defined in:
activesupport/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 'activesupport/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 'activesupport/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 'activesupport/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 'activesupport/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 'activesupport/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 'activesupport/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