15

我有一个简单的rails应用程序,带有一些控制器和一些rake任务。一些任务由配置了whenever gem的cron执行。Rake任务中的Rails异常通知器

我的一个任务,每天执行,有时它抛出一个异常,默认情况下,我收到由cron这个警告

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

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

我想调试所发生的事情,为此我刚刚安装了此exception notification创业板这条线在我Gemfile

gem "exception_notification", "~> 2.4.1", :require => 'exception_notifier' 

配置它在我的 application.rb文件

由于这个gem是一个机架中间件,它只适用于web请求而不适用于rake任务。我想启用它也用于耙子任务,我发现this gist哪些工作。

它的工作原理,但它不会干,我需要重复该方法的宝石配置,我也需要改变我所有的耙任务附上自己的块中的语句作为

exception_notify { actual_task_code } 

有什么解决这个问题的更好方法?

P.S.如果我需要更改通知宝石将不会是一个问题,因为我只添加了几行代码到我的项目中。

P.P.S.我知道我也可以更改crontab中的耙线以添加--trace选项,但我不喜欢该解决方案,导致异常通知程序imho是一个更好的解决方案,它也可以在Web代码中提供帮助。

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

我要去尝试与像减速板(原名黾)或特殊的在线服务,但他们两人都是有偿服务......

更新2:我试过Airbrake App,很不错的应用程序,但它遭受同样的问题,我仍然需要破解Rakefile来通知rake任务的异常。然而,黑客是少干,因为你只需要验证码:

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

没有必要重复任何配置参数。我认为我不能做得比这更好,以获得有关rake任务异常的通知。

回答

5

减速板宝石patches Rake允许抢救,所以它已经这样做了,我问什么...

+0

要启用记录Rake错误,您需要将'''config.rescue_rake_exceptions = true''行添加到''''conifg/initializers/airbrake.rb'''。 – KurtPreston

1

感谢您的建议;它对我很好,因为我目前只有一个cron任务。

把它擦干,你可以通过APP_CONFIG打开配置为常量,也许是: https://github.com/cjbottaro/app_config

此外,你可以扩展任何类需要的task :... do护理exception_notify { }包裹的一切。

+1

我感兴趣的是你最后的暗示,你可以扩大一点吗? – Fabio

+0

您必须深入研究Rake任务如何工作,深入Rails框架。我也不知道细节。但是你可以扩展这些分类来做你喜欢的事情。 –

13

创建配置/初始化一个task.rb文件,猴子补丁耙::任务#执行到包括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

请注意,您需要“耙/任务”,否则由于NameError,Rails的控制台将不再运行。 –