aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2012-09-26 10:08:20 -0700
committerJeremy Kemper <jeremy@bitsweat.net>2012-09-27 10:46:50 -0700
commit20f5f08d3b4df0f31099378c8178a9a78db52419 (patch)
treec6a1bf0ad5520df075bab80f28f119ee7dd748d6 /activesupport/lib
parent032c2b6b548f21ea938e3ada281a23e87f5173b7 (diff)
downloadrails-20f5f08d3b4df0f31099378c8178a9a78db52419.tar.gz
rails-20f5f08d3b4df0f31099378c8178a9a78db52419.tar.bz2
rails-20f5f08d3b4df0f31099378c8178a9a78db52419.zip
Add logger.push_tags and .pop_tags to complement logger.tagged
Avoid memory leak from unflushed logs on other threads leaving tags behind. Conflicts: activesupport/CHANGELOG.md activesupport/lib/active_support/tagged_logging.rb activesupport/test/tagged_logging_test.rb
Diffstat (limited to 'activesupport/lib')
-rw-r--r--activesupport/lib/active_support/tagged_logging.rb46
1 files changed, 28 insertions, 18 deletions
diff --git a/activesupport/lib/active_support/tagged_logging.rb b/activesupport/lib/active_support/tagged_logging.rb
index 6af87e85e6..cb5c775a22 100644
--- a/activesupport/lib/active_support/tagged_logging.rb
+++ b/activesupport/lib/active_support/tagged_logging.rb
@@ -15,16 +15,27 @@ module ActiveSupport
class TaggedLogging
def initialize(logger)
@logger = logger
- @tags = Hash.new { |h,k| h[k] = [] }
end
- def tagged(*new_tags)
- tags = current_tags
- new_tags = Array.wrap(new_tags).flatten.reject(&:blank?)
- tags.concat new_tags
- yield
+ def tagged(*tags)
+ new_tags = push_tags *tags
+ yield self
ensure
- new_tags.size.times { tags.pop }
+ pop_tags new_tags.size
+ end
+
+ def push_tags(*tags)
+ tags.flatten.reject(&:blank?).tap do |new_tags|
+ current_tags.concat new_tags
+ end
+ end
+
+ def pop_tags(size = 1)
+ current_tags.pop size
+ end
+
+ def clear_tags!
+ current_tags.clear
end
def silence(temporary_level = Logger::ERROR, &block)
@@ -46,7 +57,7 @@ module ActiveSupport
end
def flush
- @tags.delete(Thread.current)
+ clear_tags!
@logger.flush if @logger.respond_to?(:flush)
end
@@ -54,17 +65,16 @@ module ActiveSupport
@logger.send(method, *args)
end
- protected
-
- def tags_text
- tags = current_tags
- if tags.any?
- tags.collect { |tag| "[#{tag}]" }.join(" ") + " "
+ private
+ def tags_text
+ tags = current_tags
+ if tags.any?
+ tags.collect { |tag| "[#{tag}] " }.join
+ end
end
- end
- def current_tags
- @tags[Thread.current]
+ def current_tags
+ Thread.current[:activesupport_tagged_logging_tags] ||= []
+ end
end
- end
end