【问题标题】:Rails exception notifier in rake tasksrake 任务中的 Rails 异常通知器
【发布时间】: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 => %w{me@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 任务中获得异常通知是我最好的选择了。

【问题讨论】:

    标签: ruby-on-rails exception-handling error-handling rake exception-notification


    【解决方案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_CONFIGhttps://github.com/cjbottaro/app_config

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

      【讨论】:

      • 我对你最后的提示感兴趣,你能扩大一点吗?
      • 您必须深入了解 rake 任务的工作原理,更深入地了解 Rails 框架。我也不知道细节。但是你可以扩展这些类来做任何你喜欢的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 2016-03-23
      • 1970-01-01
      • 2012-06-25
      • 2016-06-03
      相关资源
      最近更新 更多