ruby-on-rails - Rails:如何记录 rake 任务中抛出的所有异常
问题描述
使用我编写的自定义 ErrorLogger,我试图找到一种方法来记录我的任何 rake 任务中发生的所有错误。一种替代方法是简单地将 begin-rescue 块添加到每个 *.rake 文件中:
# lib/tasks/example.rake
require 'error_logger/error_logger'
namespace :example do
task generic_example: :environment do
begin
...task code here
rescue Exception => e
ErrorLogger.log(e)
raise e
end
end
end
但是对所有任务文件都这样做并不是很干,所以我想知道是否有更聪明的方法来做这件事。
例如,我将我的控制器错误记录在 application_controller 中,因此无论哪个控制器正在处理请求,它都会运行:
#app/controllers/application_controller.rb
require 'error_logger/error_logger'
class ApplicationController < ActionController::Base
rescue_from Exception, with: :error_middleware
def error_middleware(exception)
ErrorLogger.log(exception)
raise error
end
end
在 rake 任务中执行类似操作的最佳方法是什么,只需编写一次日志记录逻辑并将其应用于所有 rake 任务?也许我可以将一些代码添加到 Rakefile 中来实现它?
解决方案
您可以通过猴子修补 rake 来完成此任务,如下所示
module Rake
class Task
alias_method :invoke_without_loggable, :invoke
def invoke(*args)
begin
invoke_without_loggable(*args)
rescue StandardError => e
ErrorLogger.log(e)
raise e
end
end
end
end
推荐阅读
- sql - 滥用聚合:COUNT()
- c# - 如何在 DataGridView 中编辑通过 DataRelation 添加的父列?
- r - 如何计算来自csv的数据组的RMSE
- autodesk-forge - 基于 dbID 创建传感器覆盖的问题
- sql - 使用分组集返回 0 总计
- android - 保护 SD 卡并通过应用程序访问它
- haskell - 泛型 - 创建组合所有字段的记录产品
- python - 可能版本兼容性错误突然开始在 Python 中弹出
- javascript - 水平滚动页脚的任何替代方案?
- testng - TestNG:你将如何在没有@DataProvider 的情况下使用多个数据集运行你的测试(@Test)10 次?