File: active_support/core_ext/logger.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  class: Logger#3, #32
inherits from
  Object ( Builtin-Module )
has properties
class method: define_around_helper / 1 #4
method: silence / 1 #40
alias: old_datetime_format= datetime_format #53
method: datetime_format= / 1 #56
alias: old_datetime_format datetime_format #60
method: datetime_format #63
alias: old_formatter formatter #67
method: formatter (1/2) #70
alias: old_format_message format_message #121
method: format_message (1/2) / 4 #128
method: format_message (2/E) / 4 #132
attribute: formatter (2/E) [W] #136
alias: old_format_datetime format_datetime #139
method: format_datetime / 1 #140
alias: old_msg2str msg2str #142
method: msg2str / 1 #143
  class: Formatter#75
inherits from
  Object ( Builtin-Module )
has properties
constant: Format #76
attribute: datetime_format [RW] #78
method: initialize #80
method: call / 4 #84
method: format_datetime / 1 #90
method: msg2str / 1 #98
  class: SimpleFormatter#113
inherits from
  Formatter ( Logger )
has properties
method: call / 4 #115

Class Hierarchy

Object ( Builtin-Module )
Logger#3, #32
Formatter ( Logger ) — #75
  SimpleFormatter    #113

Code

   1  # Adds the 'around_level' method to Logger.
   2 
   3  class Logger
   4    def self.define_around_helper(level)
   5      module_eval <<-end_eval
   6        def around_#{level}(before_message, after_message, &block)  # def around_debug(before_message, after_message, &block)
   7          self.#{level}(before_message)                             #   self.debug(before_message)
   8          return_value = block.call(self)                           #   return_value = block.call(self)
   9          self.#{level}(after_message)                              #   self.debug(after_message)
  10          return return_value                                       #   return return_value
  11        end                                                         # end
  12      end_eval
  13    end
  14    [:debug, :info, :error, :fatal].each {|level| define_around_helper(level) }
  15  end
  16 
  17 
  18  require 'logger'
  19 
  20  # Extensions to the built in Ruby logger.
  21  #
  22  # If you want to use the default log formatter as defined in the Ruby core, then you
  23  # will need to set the formatter for the logger as in:
  24  #
  25  #   logger.formatter = Formatter.new
  26  #
  27  # You can then specify the datetime format, for example:
  28  #
  29  #   logger.datetime_format = "%Y-%m-%d"
  30  #
  31  # Note: This logger is deprecated in favor of ActiveSupport::BufferedLogger
  32  class Logger
  33    ##
  34    # :singleton-method:
  35    # Set to false to disable the silencer
  36    cattr_accessor :silencer
  37    self.silencer = true
  38 
  39    # Silences the logger for the duration of the block.
  40    def silence(temporary_level = Logger::ERROR)
  41      if silencer
  42        begin
  43          old_logger_level, self.level = level, temporary_level
  44          yield self
  45        ensure
  46          self.level = old_logger_level
  47        end
  48      else
  49        yield self
  50      end
  51    end
  52 
  53    alias :old_datetime_format= :datetime_format=
  54    # Logging date-time format (string passed to +strftime+). Ignored if the formatter
  55    # does not respond to datetime_format=.
  56    def datetime_format=(datetime_format)
  57      formatter.datetime_format = datetime_format if formatter.respond_to?(:datetime_format=)
  58    end
  59 
  60    alias :old_datetime_format :datetime_format
  61    # Get the logging datetime format. Returns nil if the formatter does not support
  62    # datetime formatting.
  63    def datetime_format
  64      formatter.datetime_format if formatter.respond_to?(:datetime_format)
  65    end
  66 
  67    alias :old_formatter :formatter if method_defined?(:formatter)
  68    # Get the current formatter. The default formatter is a SimpleFormatter which only
  69    # displays the log message
  70    def formatter
  71      @formatter ||= SimpleFormatter.new
  72    end
  73 
  74    unless const_defined? :Formatter
  75      class Formatter
  76        Format = "%s, [%s#%d] %5s -- %s: %s\n"
  77 
  78        attr_accessor :datetime_format
  79 
  80        def initialize
  81          @datetime_format = nil
  82        end
  83 
  84        def call(severity, time, progname, msg)
  85          Format % [severity[0..0], format_datetime(time), $$, severity, progname,
  86          msg2str(msg)]
  87        end
  88 
  89        private
  90          def format_datetime(time)
  91            if @datetime_format.nil?
  92              time.strftime("%Y-%m-%dT%H:%M:%S.") << "%06d " % time.usec
  93            else
  94              time.strftime(@datetime_format)
  95            end
  96          end
  97 
  98          def msg2str(msg)
  99            case msg
 100            when ::String
 101              msg
 102            when ::Exception
 103              "#{ msg.message } (#{ msg.class })\n" <<
 104              (msg.backtrace || []).join("\n")
 105            else
 106              msg.inspect
 107            end
 108          end
 109      end
 110    end
 111 
 112    # Simple formatter which only displays the message.
 113    class SimpleFormatter < Logger::Formatter
 114      # This method is invoked when a log event occurs
 115      def call(severity, timestamp, progname, msg)
 116        "#{String === msg ? msg : msg.inspect}\n"
 117      end
 118    end
 119 
 120    private
 121      alias old_format_message format_message
 122 
 123      # Ruby 1.8.3 transposed the msg and progname arguments to format_message.
 124      # We can't test RUBY_VERSION because some distributions don't keep Ruby
 125      # and its standard library in sync, leading to installations of Ruby 1.8.2
 126      # with Logger from 1.8.3 and vice versa.
 127      if method_defined?(:formatter=)
 128        def format_message(severity, timestamp, progname, msg)
 129          formatter.call(severity, timestamp, progname, msg)
 130        end
 131      else
 132        def format_message(severity, timestamp, msg, progname)
 133          formatter.call(severity, timestamp, progname, msg)
 134        end
 135 
 136        attr_writer :formatter
 137        public :formatter=
 138 
 139        alias old_format_datetime format_datetime
 140        def format_datetime(datetime) datetime end
 141 
 142        alias old_msg2str msg2str
 143        def msg2str(msg) msg end
 144      end
 145  end