aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Staubo <alex@bengler.no>2013-01-24 22:39:19 +0100
committerAlexander Staubo <alex@bengler.no>2013-01-24 22:39:19 +0100
commit7cd0b7982520e410494e834edaa9be855d2920ad (patch)
tree0295435896a8174da08054e15e56f6a8fd99fd89
parente20c0e3a8f17d716720d248d3db5f022f7cb021a (diff)
downloadrails-7cd0b7982520e410494e834edaa9be855d2920ad.tar.gz
rails-7cd0b7982520e410494e834edaa9be855d2920ad.tar.bz2
rails-7cd0b7982520e410494e834edaa9be855d2920ad.zip
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.
-rw-r--r--activesupport/lib/active_support/tagged_logging.rb4
-rw-r--r--activesupport/test/tagged_logging_test.rb13
2 files changed, 16 insertions, 1 deletions
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