Lots going on
[lyrix.git] / vendor / rails / activesupport / lib / active_support / clean_logger.rb
blob7ce9faba48216045b991ef6d1cf39d39fee97cfd
1 require 'logger'
2 require File.dirname(__FILE__) + '/core_ext/class/attribute_accessors'
4 # Extensions to the built in Ruby logger.
6 # If you want to use the default log formatter as defined in the Ruby core, then you 
7 # will need to set the formatter for the logger as in:
9 #   logger.formatter = Formatter.new
11 # You can then specify the datetime format, for example:
13 #   logger.datetime_format = "%Y-%m-%d"
14 class Logger
15   # Set to false to disable the silencer
16   cattr_accessor :silencer
17   self.silencer = true
18   
19   # Silences the logger for the duration of the block.
20   def silence(temporary_level = Logger::ERROR)
21     if silencer
22       begin
23         old_logger_level, self.level = level, temporary_level
24         yield self
25       ensure
26         self.level = old_logger_level
27       end
28     else
29       yield self
30     end
31   end
32   
33   alias :old_datetime_format= :datetime_format=
34   # Logging date-time format (string passed to +strftime+). Ignored if the formatter
35   # does not respond to datetime_format=.
36   def datetime_format=(datetime_format)
37     formatter.datetime_format = datetime_format if formatter.respond_to?(:datetime_format=)
38   end
39   
40   alias :old_datetime_format :datetime_format
41   # Get the logging datetime format. Returns nil if the formatter does not support
42   # datetime formatting.
43   def datetime_format
44     formatter.datetime_format if formatter.respond_to?(:datetime_format)
45   end
46   
47   alias :old_formatter :formatter if method_defined?(:formatter)
48   # Get the current formatter. The default formatter is a SimpleFormatter which only
49   # displays the log message
50   def formatter
51     @formatter ||= SimpleFormatter.new
52   end
54   unless const_defined? :Formatter
55     class Formatter
56       Format = "%s, [%s#%d] %5s -- %s: %s\n"
58       attr_accessor :datetime_format
60       def initialize
61         @datetime_format = nil
62       end
64       def call(severity, time, progname, msg)
65         Format % [severity[0..0], format_datetime(time), $$, severity, progname,
66         msg2str(msg)]
67       end
69       private
70         def format_datetime(time)
71           if @datetime_format.nil?
72             time.strftime("%Y-%m-%dT%H:%M:%S.") << "%06d " % time.usec
73           else
74             time.strftime(@datetime_format)
75           end
76         end
78         def msg2str(msg)
79           case msg
80           when ::String
81             msg
82           when ::Exception
83             "#{ msg.message } (#{ msg.class })\n" <<
84             (msg.backtrace || []).join("\n")
85           else
86             msg.inspect
87           end
88         end
89     end
90   end
91   
92   # Simple formatter which only displays the message.
93   class SimpleFormatter < Logger::Formatter
94     # This method is invoked when a log event occurs
95     def call(severity, timestamp, progname, msg)
96       "#{msg}\n"
97     end
98   end
100   private
101     alias old_format_message format_message
103     # Ruby 1.8.3 transposed the msg and progname arguments to format_message.
104     # We can't test RUBY_VERSION because some distributions don't keep Ruby
105     # and its standard library in sync, leading to installations of Ruby 1.8.2
106     # with Logger from 1.8.3 and vice versa.
107     if method_defined?(:formatter=)
108       def format_message(severity, timestamp, progname, msg)
109         formatter.call(severity, timestamp, progname, msg)
110       end
111     else
112       def format_message(severity, timestamp, msg, progname)
113         formatter.call(severity, timestamp, progname, msg)
114       end
115       
116       attr_writer :formatter
117       public :formatter=
119       alias old_format_datetime format_datetime
120       def format_datetime(datetime) datetime end
122       alias old_msg2str msg2str
123       def msg2str(msg) msg end
124     end