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

root/branches/2-1-caching/activesupport/lib/active_support/buffered_logger.rb

Revision 7864, 2.8 kB (checked in by bitsweat, 2 years ago)

Use FILE and LINE for BufferedLogger severity methods

Line 
1 module ActiveSupport
2   # Inspired by the buffered logger idea by Ezra
3   class BufferedLogger
4     module Severity
5       DEBUG   = 0
6       INFO    = 1
7       WARN    = 2
8       ERROR   = 3
9       FATAL   = 4
10       UNKNOWN = 5
11     end
12     include Severity
13
14     MAX_BUFFER_SIZE = 1000
15
16     # Set to false to disable the silencer
17     cattr_accessor :silencer
18     self.silencer = true
19
20     # Silences the logger for the duration of the block.
21     def silence(temporary_level = ERROR)
22       if silencer
23         begin
24           old_logger_level, self.level = level, temporary_level
25           yield self
26         ensure
27           self.level = old_logger_level
28         end
29       else
30         yield self
31       end
32     end
33
34     attr_accessor :level
35     attr_reader :auto_flushing
36     attr_reader :buffer
37
38     def initialize(log, level = DEBUG)
39       @level         = level
40       @buffer        = []
41       @auto_flushing = 1
42
43       if log.respond_to?(:write)
44         @log = log
45       elsif File.exist?(log)
46         @log = open(log, (File::WRONLY | File::APPEND))
47         @log.sync = true
48       else
49         @log = open(log, (File::WRONLY | File::APPEND | File::CREAT))
50         @log.sync = true
51         @log.write("# Logfile created on %s" % [Time.now.to_s])
52       end
53     end
54
55     def add(severity, message = nil, progname = nil, &block)
56       return if @level > severity
57       message = (message || (block && block.call) || progname).to_s
58       # If a newline is necessary then create a new message ending with a newline.
59       # Ensures that the original message is not mutated.
60       message = "#{message}\n" unless message[-1] == ?\n
61       @buffer << message
62       auto_flush
63       message
64     end
65
66     for severity in Severity.constants
67       class_eval <<-EOT, __FILE__, __LINE__
68         def #{severity.downcase}(message = nil, progname = nil, &block)
69           add(#{severity}, message, progname, &block)
70         end
71
72         def #{severity.downcase}?
73           #{severity} >= @level
74         end
75       EOT
76     end
77
78     # Set the auto-flush period. Set to true to flush after every log message,
79     # to an integer to flush every N messages, or to false, nil, or zero to
80     # never auto-flush. If you turn auto-flushing off, be sure to regularly
81     # flush the log yourself -- it will eat up memory until you do.
82     def auto_flushing=(period)
83       @auto_flushing =
84         case period
85         when true;                1
86         when false, nil, 0;       MAX_BUFFER_SIZE
87         when Integer;             period
88         else raise ArgumentError, "Unrecognized auto_flushing period: #{period.inspect}"
89         end
90     end
91
92     def flush
93       @log.write(@buffer.slice!(0..-1).to_s) unless @buffer.empty?
94     end
95
96     def close
97       flush
98       @log.close if @log.respond_to?(:close)
99       @log = nil
100     end
101
102     protected
103       def auto_flush
104         flush if @buffer.size >= @auto_flushing
105       end
106   end
107 end
Note: See TracBrowser for help on using the browser.