vendor/activesupport/lib/active_support/buffered_logger.rb in relevance-castronaut-0.5.4 vs vendor/activesupport/lib/active_support/buffered_logger.rb in relevance-castronaut-0.6.0

- old
+ new

@@ -31,17 +31,16 @@ end end attr_accessor :level attr_reader :auto_flushing - attr_reader :buffer def initialize(log, level = DEBUG) @level = level - @buffer = [] + @buffer = {} @auto_flushing = 1 - @no_block = false + @guard = Mutex.new if log.respond_to?(:write) @log = log elsif File.exist?(log) @log = open(log, (File::WRONLY | File::APPEND)) @@ -52,16 +51,10 @@ @log.sync = true @log.write("# Logfile created on %s" % [Time.now.to_s]) end end - def set_non_blocking_io - if !RUBY_PLATFORM.match(/java|mswin/) && !(@log == STDOUT) && @log.respond_to?(:write_nonblock) - @no_block = true - end - end - def add(severity, message = nil, progname = nil, &block) return if @level > severity message = (message || (block && block.call) || progname).to_s # If a newline is necessary then create a new message ending with a newline. # Ensures that the original message is not mutated. @@ -96,15 +89,15 @@ else raise ArgumentError, "Unrecognized auto_flushing period: #{period.inspect}" end end def flush - unless buffer.empty? - if @no_block - @log.write_nonblock(buffer.slice!(0..-1).join) - else - @log.write(buffer.slice!(0..-1).join) + @guard.synchronize do + unless buffer.empty? + old_buffer = buffer + clear_buffer + @log.write(old_buffer.join) end end end def close @@ -114,8 +107,16 @@ end protected def auto_flush flush if buffer.size >= @auto_flushing + end + + def buffer + @buffer[Thread.current] ||= [] + end + + def clear_buffer + @buffer.delete(Thread.current) end end end