<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -33,11 +33,10 @@ module ActiveSupport
 
     attr_accessor :level
     attr_reader :auto_flushing
-    attr_reader :buffer
 
     def initialize(log, level = DEBUG)
       @level         = level
-      @buffer        = []
+      @buffer        = {}
       @auto_flushing = 1
       @guard = Mutex.new
 
@@ -60,9 +59,7 @@ module ActiveSupport
       # If a newline is necessary then create a new message ending with a newline.
       # Ensures that the original message is not mutated.
       message = &quot;#{message}\n&quot; unless message[-1] == ?\n
-      @guard.synchronize do
-        buffer &lt;&lt; message
-      end
+      buffer &lt;&lt; message
       auto_flush
       message
     end
@@ -96,8 +93,8 @@ module ActiveSupport
     def flush
       @guard.synchronize do
         unless buffer.empty?
-          old_buffer    = @buffer
-          @buffer       = []
+          old_buffer = buffer
+          clear_buffer
           @log.write(old_buffer.join)
         end
       end
@@ -113,5 +110,13 @@ module ActiveSupport
       def auto_flush
         flush if buffer.size &gt;= @auto_flushing
       end
+
+      def buffer
+        @buffer[Thread.current] ||= []
+      end
+
+      def clear_buffer
+        @buffer[Thread.current] = []
+      end
   end
 end</diff>
      <filename>activesupport/lib/active_support/buffered_logger.rb</filename>
    </modified>
    <modified>
      <diff>@@ -70,7 +70,7 @@ class BufferedLoggerTest &lt; Test::Unit::TestCase
       end
 
       @logger.flush
-      assert !@output.string.empty?, @logger.buffer.size
+      assert !@output.string.empty?, @logger.send(:buffer).size
     end
 
     define_method &quot;test_disabling_auto_flush_with_#{disable.inspect}_should_flush_at_max_buffer_size_as_failsafe&quot; do
@@ -83,10 +83,10 @@ class BufferedLoggerTest &lt; Test::Unit::TestCase
       end
 
       @logger.info 'there it is.'
-      assert !@output.string.empty?, @logger.buffer.size
+      assert !@output.string.empty?, @logger.send(:buffer).size
     end
   end
-  
+
   def test_should_know_if_its_loglevel_is_below_a_given_level
     ActiveSupport::BufferedLogger::Severity.constants.each do |level|
       @logger.level = ActiveSupport::BufferedLogger::Severity.const_get(level) - 1
@@ -105,7 +105,7 @@ class BufferedLoggerTest &lt; Test::Unit::TestCase
     @logger.info 'there it is.'
     assert !@output.string.empty?, @output.string
   end
-  
+
   def test_should_create_the_log_directory_if_it_doesnt_exist
     tmp_directory = File.join(File.dirname(__FILE__), &quot;tmp&quot;)
     log_file = File.join(tmp_directory, &quot;development.log&quot;)
@@ -115,4 +115,25 @@ class BufferedLoggerTest &lt; Test::Unit::TestCase
   ensure
     FileUtils.rm_rf(tmp_directory)
   end
+
+  def test_logger_should_maintain_separate_buffers_for_each_thread
+    @logger.auto_flushing = false
+
+    a = Thread.new do
+      @logger.info(&quot;a&quot;); Thread.pass;
+      @logger.info(&quot;b&quot;); Thread.pass;
+      @logger.info(&quot;c&quot;); @logger.flush
+    end
+
+    b = Thread.new do
+      @logger.info(&quot;x&quot;); Thread.pass;
+      @logger.info(&quot;y&quot;); Thread.pass;
+      @logger.info(&quot;z&quot;); @logger.flush
+    end
+
+    a.join
+    b.join
+
+    assert_equal &quot;a\nb\nc\nx\ny\nz\n&quot;, @output.string
+  end
 end</diff>
      <filename>activesupport/test/buffered_logger_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>c1a8690d582c08777055caf449c03f85b4c8aa4b</id>
    </parent>
  </parents>
  <author>
    <name>Joshua Peek</name>
    <login>josh</login>
    <email>josh@joshpeek.com</email>
  </author>
  <url>http://github.com/rails/rails/commit/96ab01e8f2b5a4475453acf60f9cf9bd8cd98483</url>
  <id>96ab01e8f2b5a4475453acf60f9cf9bd8cd98483</id>
  <committed-date>2008-08-18T21:36:13-07:00</committed-date>
  <authored-date>2008-08-18T21:33:46-07:00</authored-date>
  <message>Maintain a seperate buffer for each thread</message>
  <tree>6bf2233365025492b6ec20bd74dd95f287fe3c5e</tree>
  <committer>
    <name>Joshua Peek</name>
    <login>josh</login>
    <email>josh@joshpeek.com</email>
  </committer>
</commit>
