我有一个简单的 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 任务中的异常通知。