aboutsummaryrefslogtreecommitdiffstats
path: root/railties
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2010-01-19 16:01:53 +0100
committerJosé Valim <jose.valim@gmail.com>2010-01-19 16:13:27 +0100
commite8e8da5c85c105b7a4fec904f82c5e3c7fce507a (patch)
tree5920f0dd3da8d99e1183b80b0c682f6a6a7f76ed /railties
parentec63fdcff35d9ee195e11043ba3219b1e341a3f2 (diff)
downloadrails-e8e8da5c85c105b7a4fec904f82c5e3c7fce507a.tar.gz
rails-e8e8da5c85c105b7a4fec904f82c5e3c7fce507a.tar.bz2
rails-e8e8da5c85c105b7a4fec904f82c5e3c7fce507a.zip
Logging thread should not die on logging errors.
Diffstat (limited to 'railties')
-rw-r--r--railties/lib/rails/subscriber.rb6
-rw-r--r--railties/test/subscriber_test.rb14
2 files changed, 19 insertions, 1 deletions
diff --git a/railties/lib/rails/subscriber.rb b/railties/lib/rails/subscriber.rb
index 2674bf003e..9965786d86 100644
--- a/railties/lib/rails/subscriber.rb
+++ b/railties/lib/rails/subscriber.rb
@@ -63,7 +63,11 @@ module Rails
subscriber = subscribers[namespace.to_sym]
if subscriber.respond_to?(name) && subscriber.logger
- subscriber.send(name, ActiveSupport::Notifications::Event.new(*args))
+ begin
+ subscriber.send(name, ActiveSupport::Notifications::Event.new(*args))
+ rescue Exception => e
+ Rails.logger.error "Could not log #{args[0].inspect} event. #{e.class}: #{e.message}"
+ end
end
if args[0] == "action_dispatch.after_dispatch" && !subscribers.empty?
diff --git a/railties/test/subscriber_test.rb b/railties/test/subscriber_test.rb
index fa3f7bfabb..724e8a75d6 100644
--- a/railties/test/subscriber_test.rb
+++ b/railties/test/subscriber_test.rb
@@ -18,6 +18,10 @@ class MySubscriber < Rails::Subscriber
def bar(event)
info "#{color("cool", :red)}, #{color("isn't it?", :blue, true)}"
end
+
+ def puke(event)
+ raise "puke"
+ end
end
module SubscriberTest
@@ -105,6 +109,16 @@ module SubscriberTest
assert_equal 1, @logger.flush_count
end
+ def test_logging_thread_does_not_die_on_failures
+ Rails::Subscriber.add :my_subscriber, @subscriber
+ instrument "my_subscriber.puke"
+ instrument "action_dispatch.after_dispatch"
+ wait
+ assert_equal 1, @logger.flush_count
+ assert_equal 1, @logger.logged(:error).size
+ assert_equal 'Could not log "my_subscriber.puke" event. RuntimeError: puke', @logger.logged(:error).last
+ end
+
def test_tails_logs_when_action_dispatch_callback_is_received
log_tailer = mock()
log_tailer.expects(:tail!)