Upgraded Rails and RSpec
[monkeycharger.git] / vendor / rails / activesupport / lib / active_support / buffered_logger.rb
blobc854599e69ec0c522e179ffcd13eb47be7db93fa
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
14     MAX_BUFFER_SIZE = 1000
16     # Set to false to disable the silencer
17     cattr_accessor :silencer
18     self.silencer = true
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
34     attr_accessor :level
35     attr_reader :auto_flushing
36     attr_reader :buffer
38     def initialize(log, level = DEBUG)
39       @level         = level
40       @buffer        = []
41       @auto_flushing = 1
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
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
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
72         def #{severity.downcase}?
73           #{severity} >= @level
74         end
75       EOT
76     end
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
92     def flush
93       @log.write(@buffer.slice!(0..-1).to_s) unless @buffer.empty?
94     end
96     def close
97       flush
98       @log.close if @log.respond_to?(:close)
99       @log = nil
100     end
102     protected
103       def auto_flush
104         flush if @buffer.size >= @auto_flushing
105       end
106   end