| Class | ActiveSupport::BufferedLogger |
| In: |
vendor/rails/activesupport/lib/active_support/buffered_logger.rb
|
| Parent: | Object |
Inspired by the buffered logger idea by Ezra
| MAX_BUFFER_SIZE | = | 1000 |
| auto_flushing | [R] | |
| level | [RW] |
# File vendor/rails/activesupport/lib/active_support/buffered_logger.rb, line 37
37: def initialize(log, level = DEBUG)
38: @level = level
39: @buffer = {}
40: @auto_flushing = 1
41: @guard = Mutex.new
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: FileUtils.mkdir_p(File.dirname(log))
50: @log = open(log, (File::WRONLY | File::APPEND | File::CREAT))
51: @log.sync = true
52: @log.write("# Logfile created on %s" % [Time.now.to_s])
53: end
54: end
# File vendor/rails/activesupport/lib/active_support/buffered_logger.rb, line 56
56: def add(severity, message = nil, progname = nil, &block)
57: return if @level > severity
58: message = (message || (block && block.call) || progname).to_s
59: # If a newline is necessary then create a new message ending with a newline.
60: # Ensures that the original message is not mutated.
61: message = "#{message}\n" unless message[-1] == ?\n
62: buffer << message
63: auto_flush
64: message
65: end
Set the auto-flush period. Set to true to flush after every log message, to an integer to flush every N messages, or to false, nil, or zero to never auto-flush. If you turn auto-flushing off, be sure to regularly flush the log yourself — it will eat up memory until you do.
# File vendor/rails/activesupport/lib/active_support/buffered_logger.rb, line 84
84: def auto_flushing=(period)
85: @auto_flushing =
86: case period
87: when true; 1
88: when false, nil, 0; MAX_BUFFER_SIZE
89: when Integer; period
90: else raise ArgumentError, "Unrecognized auto_flushing period: #{period.inspect}"
91: end
92: end
# File vendor/rails/activesupport/lib/active_support/buffered_logger.rb, line 107
107: def close
108: flush
109: @log.close if @log.respond_to?(:close)
110: @log = nil
111: end
# File vendor/rails/activesupport/lib/active_support/buffered_logger.rb, line 94
94: def flush
95: @guard.synchronize do
96: unless buffer.empty?
97: old_buffer = buffer
98: @log.write(old_buffer.join)
99: end
100:
101: # Important to do this even if buffer was empty or else @buffer will
102: # accumulate empty arrays for each request where nothing was logged.
103: clear_buffer
104: end
105: end
Silences the logger for the duration of the block.
# File vendor/rails/activesupport/lib/active_support/buffered_logger.rb, line 21
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
# File vendor/rails/activesupport/lib/active_support/buffered_logger.rb, line 114
114: def auto_flush
115: flush if buffer.size >= @auto_flushing
116: end
# File vendor/rails/activesupport/lib/active_support/buffered_logger.rb, line 118
118: def buffer
119: @buffer[Thread.current] ||= []
120: end