aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--railties/lib/rails/subscriber.rb12
-rw-r--r--railties/lib/rails/subscriber/test_helper.rb7
-rw-r--r--railties/test/subscriber_test.rb23
3 files changed, 40 insertions, 2 deletions
diff --git a/railties/lib/rails/subscriber.rb b/railties/lib/rails/subscriber.rb
index f98dec738d..88a6f77eaa 100644
--- a/railties/lib/rails/subscriber.rb
+++ b/railties/lib/rails/subscriber.rb
@@ -30,7 +30,8 @@ module Rails
# purposes(which slows down the main thread). Besides of providing a centralized
# facility on top of Rails.logger.
#
- # Finally, Subscriber some helpers to deal with logging, like managing console colors.
+ # Subscriber also has some helpers to deal with logging and automatically flushes
+ # all logs when the request finishes (via action_dispatch.callback notification).
class Subscriber
cattr_accessor :colorize_logging, :instance_writer => false
self.colorize_logging = true
@@ -64,6 +65,15 @@ module Rails
if subscriber.respond_to?(name) && subscriber.logger
subscriber.send(name, ActiveSupport::Notifications::Event.new(*args))
end
+
+ flush_all! if args[0] == "action_dispatch.callback"
+ end
+
+ # Flush all subscribers' logger.
+ def self.flush_all!
+ loggers = subscribers.values.map(&:logger)
+ loggers.uniq!
+ loggers.each { |l| l.flush if l.respond_to?(:flush) }
end
# By default, we use the Rails.logger for logging.
diff --git a/railties/lib/rails/subscriber/test_helper.rb b/railties/lib/rails/subscriber/test_helper.rb
index 8b981dc3a6..1464767ed9 100644
--- a/railties/lib/rails/subscriber/test_helper.rb
+++ b/railties/lib/rails/subscriber/test_helper.rb
@@ -58,7 +58,10 @@ module Rails
end
class MockLogger
+ attr_reader :flush_count
+
def initialize
+ @flush_count = 0
@logged = Hash.new { |h,k| h[k] = [] }
end
@@ -69,6 +72,10 @@ module Rails
def logged(level)
@logged[level].compact.map { |l| l.to_s.strip }
end
+
+ def flush
+ @flush_count += 1
+ end
end
# Wait notifications to be published.
diff --git a/railties/test/subscriber_test.rb b/railties/test/subscriber_test.rb
index db953bb041..7e91b7333f 100644
--- a/railties/test/subscriber_test.rb
+++ b/railties/test/subscriber_test.rb
@@ -76,10 +76,31 @@ module SubscriberTest
def test_does_not_send_the_event_if_logger_is_nil
Rails.logger = nil
+ @subscriber.expects(:some_event).never
Rails::Subscriber.add :my_subscriber, @subscriber
instrument "my_subscriber.some_event"
wait
- assert_equal [], @logger.logged(:info)
+ end
+
+ def test_flushes_loggers
+ Rails::Subscriber.add :my_subscriber, @subscriber
+ Rails::Subscriber.flush_all!
+ assert_equal 1, @logger.flush_count
+ end
+
+ def test_flushes_loggers_when_action_dispatch_callback_is_received
+ Rails::Subscriber.add :my_subscriber, @subscriber
+ instrument "action_dispatch.callback"
+ wait
+ assert_equal 1, @logger.flush_count
+ end
+
+ def test_flushes_the_same_logger_just_once
+ Rails::Subscriber.add :my_subscriber, @subscriber
+ Rails::Subscriber.add :another, @subscriber
+ instrument "action_dispatch.callback"
+ wait
+ assert_equal 1, @logger.flush_count
end
class SyncSubscriberTest < ActiveSupport::TestCase