Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

root/trunk/activesupport/lib/active_support/clean_logger.rb

Revision 7719, 3.7 kB (checked in by bitsweat, 2 years ago)

Ruby 1.9 compat, consistent load paths

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