如何将ActionController::RoutingError标记为Sentry中的错误?
Rails 6.1 中让 Sentry 捕获 ActionController::RoutingError 为错误的配置方法
问题背景
我在Rails 6.1应用中使用新版Sentry(非Raven),依赖的gem配置如下:
gem "sentry-ruby" gem "sentry-rails"
当用户触发ActionController::RoutingError时,Sentry中仅能看到对应的事务,却未将该异常标记为错误。查看Sentry默认忽略列表:
> Sentry::Configuration::IGNORE_DEFAULT => ["Mongoid::Errors::DocumentNotFound", "Rack::QueryParser::InvalidParameterError", "Rack::QueryParser::ParameterTypeError", "Sinatra::NotFound"]
可以确认ActionController::RoutingError不在默认忽略范围内。我尝试在sentry.rb初始化文件中清空excluded_exceptions,但没有效果:
Sentry.init do |config| ... config.excluded_exceptions = [] end
需求:将ActionController::RoutingError作为错误上报至Sentry,且不想使用通配路由match '*path', to: "application#handle_route_error", via: :all的方案,也考虑过修改中间件但不清楚具体操作。
解决方案
方法一:启用Sentry-rails的路由错误捕获配置
新版sentry-rails提供了专门的配置项来捕获路由错误,只需在初始化文件中开启即可:
Sentry.init do |config| # 保留你的其他配置(如dsn、environment等) config.rails.capture_routing_errors = true end
该配置会自动将ActionController::RoutingError以错误级别上报至Sentry,无需额外修改中间件。
方法二:自定义中间件手动捕获上报
如果方法一未生效,可以通过自定义中间件来手动捕获路由错误并上报:
- 创建中间件文件
app/middleware/capture_routing_errors.rb:
class CaptureRoutingErrors def initialize(app) @app = app end def call(env) begin @app.call(env) rescue ActionController::RoutingError => exception # 以错误级别捕获异常 Sentry.capture_exception(exception, level: :error) # 继续抛出异常,让Rails处理默认错误页面逻辑 raise exception end end end
- 在
config/application.rb中注册该中间件,注意要放在ActionDispatch::ShowExceptions之前,确保能在Rails处理异常前捕获:
module YourAppName class Application < Rails::Application # 其他应用配置... config.middleware.insert_before ActionDispatch::ShowExceptions, CaptureRoutingErrors end end
内容的提问来源于stack exchange,提问作者RailsDFW
相关产品推荐
相关产品推荐

