keep 404's out of my logs

Jonathan Rochkind wrote:

Is there any easy way to tell Rails to keep [RoutingError, UnknownAction, UnknownController] out of my logs? Or
put them in a different log? Or at least omit the backtrace (which is
not a useful backtrace, since it's to Rails internals and is always the
same for an UnknownAction or RoutingError).

By the time rescue_action_in_public is called, it seems to be too late,
the thing has already been logged.

Figured it out myself looking at source in ActionController::rescue.rb .
I'll put it here for the archives.

In Rails 2.1 (and hopefully 2.x in general), rescue_action_in_public is
called by rescue_action.

rescue_action also calls log_error, after calling
rescue_action_in_public.

It's log_error that writes uncaught exceptions to the log as fatal, with
complete backtrace.

So I can override log_error, and check the class of the error. If it's
not a routing type error, call super. If it is, I can not log it, log it
to a different logger, log it with a different severity, whatever.

Or you could just define a catch-all route as your last defined route,
and do something like the following:

  # last route defined in routes.rb:
  ...
  map.connect
'*path_leftovers', :controller=>'testapp', :action=>'pre_404'
  ...

  # in testapp_controller.rb or application(_controller).rb:
  ...
  def pre_404
    logger.warn("WARN: pre_404: path=#{request.path}")
    redirect_to '/404.html'
  end
  ...

Or you could define another cath-all route per controller, or you
could dev your own custom 404-like meth/screen, or set some error msg
for display in and redirect to some default action (say index) for the
given controller, or .... It all depends on what you want to do.

Note that params[:path_leftovers] in pre_404 would be an Array of
String path-chunks.

Jeff