【问题标题】:How to skip logging uncaught exceptions in Rails?如何在 Rails 中跳过记录未捕获的异常?
【发布时间】:2018-09-23 09:59:38
【问题描述】:

当使用自定义 exceptions_apprescue_responses 时,应用程序可以更好地控制未捕获的异常,并且来自 DebugExceptions 中间件的过多日志记录会变成噪音。

例如,应用程序知道如何处理ActionPolicy::Unauthorized,在exceptions_app 中呈现正确的页面,因此以下日志是多余的:

FATAL -- :   
FATAL -- : ActionPolicy::Unauthorized (Not Authorized):
FATAL -- :   
FATAL -- : app/controllers/topics_suggest_controller.rb:47:in `topic_load' 

跳过仅记录rescue_responses 中列出的异常的最惯用方法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5


    【解决方案1】:

    以下是一些历史记录。截至 2021 年 6 月 25 日,我对 Rails 的 PR https://github.com/rails/rails/pull/42592 已被接受,此功能将在 Rails 6.1.5 中提供


    方法 1

    很想从应用程序的 Rails 堆栈中删除 DebugExceptions 中间件。

    config/application.rb:

    config.middleware.delete ActionDispatch::DebugExceptions
    

    问题在于,正是中间件决定了 Rails 找不到路由并在这种情况下抛出 ActionController::RoutingError。因此,如果您想在 exceptions_app 中对此异常做出反应,那么这种方法不适合您。

    如果您可以在没有找到路由时看到 HTTP 状态 404 和纯文本响应 Not found,请继续使用此方法。

    方法2

    猴子补丁或以某种方式更改ActionDispatch::DebugExceptions。事实上,在 2013 年有一个提议要更改 DebugExceptions 的行为,以便它跳过在 rescue_responses:9343 中注册的日志记录异常,其中有一个示例代码。

    我觉得覆盖整个类太过分了,所以我选择覆盖它负责记录错误的method log_error

    lib/ext/suppress_exceptions.rb:

    module Ext
      module SuppressExceptions
        private
    
        def log_error(_request, wrapper)
          exception = wrapper.exception
          return if ActionDispatch::ExceptionWrapper.rescue_responses.key? exception.class.name
          super
        end
      end
    end
    

    config/initializers/error_handling.rb:

    require_dependency 'ext/suppress_exceptions'
    
    ActiveSupport.on_load(:action_controller) do
      ActionDispatch::DebugExceptions.prepend Ext::SuppressExceptions
    end
    

    【讨论】:

    • 你的第二种方法很好,虽然我改为猴子补丁ActionDispatch::DebugExceptions#logger(request) 以我的方式记录它们。
    • @Lloeki 很高兴知道我不是唯一需要这种东西的人。我创建了一个pull request,如果您有什么要说的,欢迎您。
    猜你喜欢
    • 2010-09-06
    • 2010-11-08
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2021-10-05
    • 1970-01-01
    • 2015-03-01
    相关资源
    最近更新 更多