From 7cd0b7982520e410494e834edaa9be855d2920ad Mon Sep 17 00:00:00 2001
From: Alexander Staubo <alex@bengler.no>
Date: Thu, 24 Jan 2013 22:39:19 +0100
Subject: Fix TaggedLogging to allow loggers to be instantiated multiple times
 without having to share the stack of tags. This is accomplished by using a
 unique key for the thread-local tag list. Fixes #9064.

---
 activesupport/lib/active_support/tagged_logging.rb |  4 +++-
 activesupport/test/tagged_logging_test.rb          | 13 +++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

(limited to 'activesupport')

diff --git a/activesupport/lib/active_support/tagged_logging.rb b/activesupport/lib/active_support/tagged_logging.rb
index 18bc919734..a670d01685 100644
--- a/activesupport/lib/active_support/tagged_logging.rb
+++ b/activesupport/lib/active_support/tagged_logging.rb
@@ -42,7 +42,9 @@ module ActiveSupport
       end
 
       def current_tags
-        Thread.current[:activesupport_tagged_logging_tags] ||= []
+        # We use our object ID here to void conflicting with other instances
+        thread_key = @thread_key ||= "activesupport_tagged_logging_tags:#{object_id}".freeze
+        Thread.current[thread_key] ||= []
       end
 
       private
diff --git a/activesupport/test/tagged_logging_test.rb b/activesupport/test/tagged_logging_test.rb
index 27f629474e..03a63e94e8 100644
--- a/activesupport/test/tagged_logging_test.rb
+++ b/activesupport/test/tagged_logging_test.rb
@@ -79,6 +79,19 @@ class TaggedLoggingTest < ActiveSupport::TestCase
     assert_equal "[OMG] Cool story bro\n[BCX] Funky time\n", @output.string
   end
 
+  test "keeps each tag in their own instance" do
+    @other_output = StringIO.new
+    @other_logger = ActiveSupport::TaggedLogging.new(MyLogger.new(@other_output))
+    @logger.tagged("OMG") do
+      @other_logger.tagged("BCX") do
+        @logger.info "Cool story bro"
+        @other_logger.info "Funky time"
+      end
+    end
+    assert_equal "[OMG] Cool story bro\n", @output.string
+    assert_equal "[BCX] Funky time\n", @other_output.string
+  end
+
   test "cleans up the taggings on flush" do
     @logger.tagged("BCX") do
       Thread.new do
-- 
cgit v1.2.3