rake任务中的Rails异常通知程序

时间:2011-08-23 12:58:42

标签: ruby-on-rails exception-handling error-handling rake exception-notification

我有一个简单的rails应用程序,带有一些控制器和一些rake任务。由whenever gem配置的cron执行几项任务。

我的任务之一是每天执行,有时会引发异常,默认情况下我会通过cron收到此警告

rake aborted!
undefined method `parameterize' for nil:NilClass

Tasks: TOP => mailboxes:clean_processed
(See full trace by running task with --trace)

我想调试正在发生的事情,因此我刚刚在Gemfile

中使用此行安装了这个exception notification gem
gem "exception_notification", "~> 2.4.1", :require => 'exception_notifier'

并使用

在我的application.rb文件中进行配置
# enable exception notification
config.middleware.use ExceptionNotifier,
                      :email_prefix => "[MyAppName] ",
                      :sender_address => %{"notifier" <report@example.com>},
                      :exception_recipients => %w{me@example.com}

由于这个gem是一个机架中间件,它只适用于Web请求而不适用于rake任务。我也想为rake任务启用它,我找到了this gist来完成工作。

它有效,但它不是DRY,我需要在该方法中重复gem配置,我还需要更改所有rake任务,将它们的语句括在一个块中,如

exception_notify { actual_task_code }

有没有更好的方法来解决这个问题?

P.S。如果我需要更改通知gem不会有问题,因为我只为我的项目添加了几行代码。

P.P.S。我知道我也可以更改crontab中的rake行来添加--trace选项,但我不喜欢这个解决方案,导致异常通知程序imho是一个更好的解决方案,它也有助于Web代码。

更新我刚刚发现了这个相关问题:exception_notification for delayed_job但这两个答案都使用了类似的技巧。

我将尝试使用Airbrake(以前称为hoptoad)或Exceptional等在线服务,但这两种服务都是付费服务......

更新2 :我尝试了Airbrake App非常好的应用程序,但它遇到了同样的问题,我仍然需要破解Rakefile来通知rake任务的异常。然而,hack不那么干,因为你只需要这个代码:

# notify exceptions
def exception_notify
  yield
rescue Exception => exception
  HoptoadNotifier.notify exception
  raise exception
end

无需重复任何配置参数。我认为我不能做得比这更好,以获得rake任务中的异常通知。

4 个答案:

答案 0 :(得分:14)

在config / initializers中创建一个task.rb文件,其中有猴子补丁Rake :: Task#execute包含exception_notify的功能:

module Rake
  class Task
    alias :orig_execute :execute
    def execute(args=nil)
      orig_execute(args)
    rescue Exception => exception
      # Exception notification stuff
    end
  end
end

使用Rails 3.0.12,Rake 0.9.2.2进行测试。

答案 1 :(得分:6)

有一个新的更简单的解决方案:gem https://github.com/nikhaldi/exception_notification-rake

答案 2 :(得分:4)

Airbrake gem patches Rake允许救援,所以它已经做了我要求的......

答案 3 :(得分:1)

感谢您的建议;它对我很有用,因为我现在只有一个cron任务。

要干掉它,您可以将配置转换为常量,可能是通过APP_CONFIGhttps://github.com/cjbottaro/app_config

此外,你可以扩展任何关注task :... do的类来包装exception_notify { }中的所有内容。