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