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 logger,rails 5