diff --git a/activesupport/lib/active_support/buffered_logger.rb b/activesupport/lib/active_support/buffered_logger.rb index c56dccc1f7d2f3c269a9e051c87fed030585ccee..c46386c6b09308fa308507b389292c017fcaa62a 100644 --- a/activesupport/lib/active_support/buffered_logger.rb +++ b/activesupport/lib/active_support/buffered_logger.rb @@ -39,6 +39,7 @@ def initialize(log, level = DEBUG) @level = level @buffer = [] @auto_flushing = 1 + @no_block = false if log.respond_to?(:write) @log = log @@ -52,13 +53,19 @@ def initialize(log, level = DEBUG) 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. message = "#{message}\n" unless message[-1] == ?\n - @buffer << message + buffer << message auto_flush message end @@ -90,7 +97,13 @@ def auto_flushing=(period) end def flush - @log.write(@buffer.slice!(0..-1).join) unless @buffer.empty? + unless buffer.empty? + if @no_block + @log.write_nonblock(buffer.slice!(0..-1).join) + else + @log.write(buffer.slice!(0..-1).join) + end + end end def close @@ -101,7 +114,7 @@ def close protected def auto_flush - flush if @buffer.size >= @auto_flushing + flush if buffer.size >= @auto_flushing end end end diff --git a/railties/lib/initializer.rb b/railties/lib/initializer.rb index c3056c196dacfc0340028aed9c96619b390a74a8..899688b55949417bae0bbc02b2f453df0f0f5e48 100644 --- a/railties/lib/initializer.rb +++ b/railties/lib/initializer.rb @@ -250,7 +250,10 @@ def initialize_logger begin logger = ActiveSupport::BufferedLogger.new(configuration.log_path) logger.level = ActiveSupport::BufferedLogger.const_get(configuration.log_level.to_s.upcase) - logger.auto_flushing = false if configuration.environment == "production" + if configuration.environment == "production" + logger.auto_flushing = false + logger.set_non_blocking_io + end rescue StandardError =>e logger = ActiveSupport::BufferedLogger.new(STDERR) logger.level = ActiveSupport::BufferedLogger::WARN