ruby-on-rails – rake任务中的Rails异常通知程序

我有一个简单的rails应用程序与几个控制器和一些耙子任务. cron配置了 whenever gem执行几个任务.

我的任务之一是每天执行,有时它会引发一个异常,认情况下我会收到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 "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}

由于这个宝石是一个机架中间件,它只适用于Web请求,而不适用于耙子任务.我也想为耙子任务启用它,我发现这个工作的this gist.

它的工作原理,但它不是干的,我需要重复宝石配置在该方法,我还需要更改所有我的耙子任务,以将其语句包含在一个块中,如

exception_notify { actual_task_code }

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

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

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

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

我将尝试使用像Airbrake(以前称为hoptoad)或特殊的在线服务,但都是付费服务…

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

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

无需重复任何配置参数.我认为我不能比这更好地获得耙子任务中的例外的通知.

解决方法

在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.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...