rake 任务中的 Rails 异常通知器

Posted

技术标签:

【中文标题】rake 任务中的 Rails 异常通知器【英文标题】:Rails exception notifier in rake tasks 【发布时间】:2011-11-01 22:43:35 【问题描述】:

我有一个简单的 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 => %wme@example.com

由于这个 gem 是一个机架中间件,它只适用于 web 请求,而不适用于 rake 任务。我也想为 rake 任务启用它,我发现 this gist 可以完成这项工作。

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

exception_notify  actual_task_code 

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

附:如果我需要更改通知 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 任务中获得异常通知是我最好的选择了。

【问题讨论】:

【参考方案1】:

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

【讨论】:

请注意,您需要“rake/task”,否则 Rails 的控制台将由于 NameError 而不再运行。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

要启用 Rake 错误记录,您需要将行 config.rescue_rake_exceptions = true 添加到 conifg/initializers/airbrake.rb【参考方案4】:

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

要干燥它,您可以将配置转换为常量,也许通过APP_CONFIG: https://github.com/cjbottaro/app_config

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

【讨论】:

我对你最后的提示感兴趣,你能扩大一点吗? 您必须深入了解 rake 任务的工作原理,更深入地了解 Rails 框架。我也不知道细节。但是你可以扩展这些类来做任何你喜欢的事情。

以上是关于rake 任务中的 Rails 异常通知器的主要内容,如果未能解决你的问题,请参考以下文章

强制 Rake 任务在特定的 Rails 环境中运行

在 rake 任务中使用 rails logger,rails 5

rake db rake 任务不工作 Ruby 2.4.0 & Rails 5.0.1

ruby Rails中自定义rake任务

Rails的Rake任务

rails rake 任务是不是提供对 ActiveRecord 模型的访问?