From 79a9c7a702f4bccb2af5c82bb9a78209b28ab1c7 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Tue, 25 Sep 2007 03:47:37 +0000 Subject: Added ActiveSupport::BufferedLogger as a duck-typing alternative (albeit with no formatter) to the Ruby Logger, which provides a very nice speed bump (inspired by Ezra's buffered logger) [DHH] Changed the default logger from Ruby's own Logger with the clean_logger extensions to ActiveSupport::BufferedLogger for performance reasons [DHH]. (You can change it back with config.logger = Logger.new(/path/to/log, level).) git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7626 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- .../lib/active_support/buffered_logger.rb | 79 ++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 activesupport/lib/active_support/buffered_logger.rb (limited to 'activesupport/lib/active_support/buffered_logger.rb') diff --git a/activesupport/lib/active_support/buffered_logger.rb b/activesupport/lib/active_support/buffered_logger.rb new file mode 100644 index 0000000000..b28f4a5ad3 --- /dev/null +++ b/activesupport/lib/active_support/buffered_logger.rb @@ -0,0 +1,79 @@ +module ActiveSupport + # Inspired by the buffered logger idea by Ezra + class BufferedLogger + module Severity + DEBUG = 0 + INFO = 1 + WARN = 2 + ERROR = 3 + FATAL = 4 + UNKNOWN = 5 + end + include Severity + + # Set to false to disable the silencer + cattr_accessor :silencer + self.silencer = true + + # Silences the logger for the duration of the block. + def silence(temporary_level = ERROR) + if silencer + begin + old_logger_level, self.level = level, temporary_level + yield self + ensure + self.level = old_logger_level + end + else + yield self + end + end + + attr_accessor :level, :auto_flushing + attr_reader :buffer + + def initialize(log, level = DEBUG) + @level = level + @buffer = "" + @auto_flushing = true + + if log.respond_to?(:write) + @log = log + elsif File.exist?(log) + @log = open(log, (File::WRONLY | File::APPEND)) + @log.sync = true + else + @log = open(log, (File::WRONLY | File::APPEND | File::CREAT)) + @log.sync = true + @log.write("# Logfile created on %s" % [Time.now.to_s]) + end + end + + for severity in Severity.constants + class_eval <<-EOT + def #{severity.downcase}(message) + return if @level > #{severity} + message << "\\n" unless message[-1] == ?\\n + @buffer << message + flush if auto_flushing + message + end + + def #{severity.downcase}? + @level == #{severity} + end + EOT + end + + def flush + return if @buffer.size == 0 + @log.write(@buffer.slice!(0..-1)) + end + + def close + flush + @log.close if @log.respond_to?(:close) + @log = nil + end + end +end \ No newline at end of file -- cgit v1.2.3