Fresh Rails 4.2 set up. I want to suppress long error backtraces. In the following backtrace log first line would be enough for me, and next 4 could be removed
ActionController::RoutingError (No route matches [GET] "/user"):
actionpack (4.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
web-console (2.1.2) lib/web_console/middleware.rb:37:in `call'
actionpack (4.2.1) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.2.1) lib/rails/rack/logger.rb:38:in `call_app'
I've added a new silencer to backtrace_silencers.rb
# config/initializers/backtrace_silencers.rb
Rails.backtrace_cleaner.add_silencer { |line| line =~ /lib/ }
After server restart - nothing happens, i'm still getting same backtrace log. (Each line matching /lib/
was supposed to be removed: http://api.rubyonrails.org/classes/ActiveSupport/BacktraceCleaner.htm)
Sanity check:
> line = "actionpack (4.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'"
=> "actionpack (4.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'"
> line =~ /lib/
=> 19
But filters work:
# config/initializers/backtrace_silencers.rb
Rails.backtrace_cleaner.add_filter { |line| line.gsub('lib', 'yeah!') }
Now backtrace looks like this:
ActionController::RoutingError (No route matches [GET] "/user"):
actionpack (4.2.1) yeah!/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
web-console (2.1.2) yeah!/web_console/middleware.rb:37:in `call'
actionpack (4.2.1) yeah!/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.2.1) yeah!/rails/rack/logger.rb:38:in `call_app'
Would appreciate an advice how to make silencers work. Cheers!
Remove default silencers before add own:
This is because of https://github.com/vipulnsward/rails/blob/ecc8f283cfc1b002b5141c527a827e74b770f2f0/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb#L155-L156
Since
application_trace
is empty(This is because error is not from user code but route error), we are falling back toframework_trace
, which does not filter it (it filters only noise).You can reach your gaol it with creating your own log_formatter. In your
development.rb
and/ortest.rb
addAnd create simple class in models with only method
call
required. There you can modify your backtrace as you wish.I had a similar problem, which was caused by this code in test_helper:
It was added to diagnose the error at some stage and overrides this. Removing that removed the backtrace.
Problem was with Minitest-Reporters gem (adds colors to Minitest output), it messes up with Rails backtrace filters
To fix you need to add the following to
test_helper.rb
Problem and solution details described here: https://github.com/kern/minitest-reporters#caveats