Reduce log noise handling ActionController::RoutingErrors

Each time a missing route is hit 32 lines of internal rails traces
are written to the log. This is overly verbose and doesn't offer
any actionable information to the user.

With this change we'll still write an error message showing the
route error but the trace will be omitted.
This commit is contained in:
Alberto Fernández Capel 2018-01-04 11:27:14 +00:00 committed by Alberto F. Capel
parent f47be7bd96
commit c8f4c53d55
4 changed files with 34 additions and 3 deletions

View File

@ -1,3 +1,7 @@
* Reduced log noise handling ActionController::RoutingErrors.
*Alberto Fernández-Capel*
* Keep part when scope option has value
When a route was defined within an optional scope, if that route didn't

View File

@ -138,9 +138,7 @@ module ActionDispatch
return unless logger
exception = wrapper.exception
trace = wrapper.application_trace
trace = wrapper.framework_trace if trace.empty?
trace = wrapper.exception_trace
ActiveSupport::Deprecation.silence do
message = []

View File

@ -62,6 +62,12 @@ module ActionDispatch
self.class.status_code_for_exception(unwrapped_exception.class.name)
end
def exception_trace
trace = application_trace
trace = framework_trace if trace.empty? && !exception.is_a?(ActionController::RoutingError)
trace
end
def application_trace
clean_backtrace(:silent)
end

View File

@ -466,6 +466,8 @@ class DebugExceptionsTest < ActionDispatch::IntegrationTest
end
test "logs exception backtrace when all lines silenced" do
@app = DevelopmentApp
output = StringIO.new
backtrace_cleaner = ActiveSupport::BacktraceCleaner.new
backtrace_cleaner.add_silencer { true }
@ -478,6 +480,27 @@ class DebugExceptionsTest < ActionDispatch::IntegrationTest
assert_operator((output.rewind && output.read).lines.count, :>, 10)
end
test "doesn't log the framework backtrace when error type is a routing error" do
@app = ProductionApp
output = StringIO.new
backtrace_cleaner = ActiveSupport::BacktraceCleaner.new
backtrace_cleaner.add_silencer { true }
env = { "action_dispatch.show_exceptions" => true,
"action_dispatch.logger" => Logger.new(output),
"action_dispatch.backtrace_cleaner" => backtrace_cleaner }
assert_raises ActionController::RoutingError do
get "/pass", headers: env
end
log = output.rewind && output.read
assert_includes log, "ActionController::RoutingError (No route matches [GET] \"/pass\")"
assert_equal 3, log.lines.count
end
test "display backtrace when error type is SyntaxError" do
@app = DevelopmentApp