From afde6fdd5ef3e6b0693a7e330777e85ef4cffddb Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 19 Oct 2011 12:59:33 -0500 Subject: Added X-Request-Id tracking and TaggedLogging to easily log that and other production concerns --- activesupport/lib/active_support.rb | 1 + activesupport/lib/active_support/tagged_logging.rb | 68 ++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 activesupport/lib/active_support/tagged_logging.rb (limited to 'activesupport/lib') diff --git a/activesupport/lib/active_support.rb b/activesupport/lib/active_support.rb index cc9ea5cffa..ff78e718f2 100644 --- a/activesupport/lib/active_support.rb +++ b/activesupport/lib/active_support.rb @@ -71,6 +71,7 @@ module ActiveSupport autoload :OrderedOptions autoload :Rescuable autoload :StringInquirer + autoload :TaggedLogging autoload :XmlMini end diff --git a/activesupport/lib/active_support/tagged_logging.rb b/activesupport/lib/active_support/tagged_logging.rb new file mode 100644 index 0000000000..0d8504bc1f --- /dev/null +++ b/activesupport/lib/active_support/tagged_logging.rb @@ -0,0 +1,68 @@ +module ActiveSupport + # 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. + class TaggedLogging + def initialize(logger) + @logger = logger + @tags = [] + end + + def tagged(*tags) + new_tags = Array.wrap(tags).flatten + @tags += new_tags + yield + ensure + new_tags.size.times { @tags.pop } + end + + + def add(severity, message = nil, progname = nil, &block) + @logger.add(severity, "#{tags}#{message}", progname, &block) + end + + + def fatal(progname = nil, &block) + add(@logger.class::FATAL, progname, &block) + end + + def error(progname = nil, &block) + add(@logger.class::ERROR, progname, &block) + end + + def warn(progname = nil, &block) + add(@logger.class::WARN, progname, &block) + end + + def info(progname = nil, &block) + add(@logger.class::INFO, progname, &block) + end + + def debug(progname = nil, &block) + add(@logger.class::DEBUG, progname, &block) + end + + def unknown(progname = nil, &block) + add(@logger.class::UNKNOWN, progname, &block) + end + + + def method_missing(method, *args) + @logger.send(method, *args) + end + + + private + def tags + if @tags.any? + @tags.collect { |tag| "[#{tag}]" }.join(" ") + " " + end + end + end +end -- cgit v1.2.3