15

我有一个简单的 Rails 应用程序,带有一些控制器和一些 rake 任务。有几个任务由配置了时 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

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 任务启用它,我发现这个 gist可以完成这项工作。

它可以工作,但它不是 DRY,我需要在该方法中重复 gem 配置,并且我还需要更改我的所有 rake 任务以将它们的语句包含在一个块中,如

exception_notify { actual_task_code }

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

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

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

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

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

更新 2:我尝试了Airbrake 应用程序,非常好的应用程序,但它遇到了同样的问题,我仍然需要破解 Rakefile 以通知来自 rake 任务的异常。但是,hack 不那么枯燥,因为您只需要以下代码:

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

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

4

4 回答 4

15

在 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 测试。

于 2012-05-29T21:19:24.903 回答
6

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

于 2013-02-23T21:31:44.830 回答
4

Airbrake gem修补 Rake以允许救援,所以它已经完成了我的要求......

于 2012-05-15T17:46:46.460 回答
1

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

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

此外,您可以扩展任何需要处理的类task :... do以将所有内容包装在exception_notify { }.

于 2011-10-08T11:18:08.030 回答