How to skip logging uncaught exceptions in Rails?

你说的曾经没有我的故事 提交于 2021-01-29 07:21:21

问题


When using custom exceptions_app and rescue_responses, an application has more control of uncaught exceptions and an excessive logging from DebugExceptions middleware becomes noise.

As an example, the application knows how to process ActionPolicy::Unauthorized, renders proper page in exceptions_app and thus the following log is redundant:

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

What would be the most idiomatic way to skip logging only those exceptions listed in rescue_responses?


回答1:


Approach 1

It's tempting to delete DebugExceptions middleware from the application's Rails stack.

config/application.rb:

config.middleware.delete ActionDispatch::DebugExceptions

The problem is that it is exactly the middleware that determines Rails cannot find a route and throws ActionController::RoutingError in such cases. Hence, if you would like to react to this exception in your exceptions_app, this approach is a no-go for you.

Go ahead and use this approach if it's fine for you to see HTTP status 404 and plain text response Not found when no route was found.

Approach 2

Monkey patch or change ActionDispatch::DebugExceptions in some way. In fact, there was a proposal in 2013 to change DebugExceptions behavior so that it skips logging exceptions registered in rescue_responses: 9343, there is an example code in there.

I think it's too much to overwrite the whole class, so I chose to override its method log_error responsible for logging errors.

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


来源:https://stackoverflow.com/questions/52465009/how-to-skip-logging-uncaught-exceptions-in-rails

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!