How do I log the entire trace back of a Ruby exception using the default Rails logger?

33,503

Solution 1

logger.error $!.backtrace

Also, don't forget you can

rescue ErrorType => error_name

to give your error a variable name other than the default $!.

Solution 2

The way rails does it is

137             logger.fatal(
138               "\n\n#{exception.class} (#{exception.message}):\n    " +
139               clean_backtrace(exception).join("\n    ") +
140               "\n\n"
141             )

248       def clean_backtrace(exception)
249         if backtrace = exception.backtrace
250           if defined?(RAILS_ROOT)
251             backtrace.map { |line| line.sub RAILS_ROOT, '' }
252           else
253             backtrace
254           end
255         end
256       end

Solution 3

In later versions of Rails, simply uncomment the following line in RAIL_ROOT/config/initializers/backtrace_silencers.rb (or add this file itself if it's not there):

# Rails.backtrace_cleaner.remove_silencers!

This way you get the full backtrace written to the log on an exception. This works for me in v2.3.4.

Solution 4

logger.error caller.join("\n") should do the trick.

Solution 5

In Rails, ActionController::Rescue deals with it. In my application controller actions, i'm using method log_error from this module to pretty-format backtrace in logs:

def foo_action
  # break something in here
rescue
  log_error($!)
  # call firemen
end
Share:
33,503
thedeepfield
Author by

thedeepfield

Young QA Manager/Developer

Updated on May 26, 2020

Comments

  • thedeepfield
    thedeepfield almost 4 years

    I am working on rails project and I am trying to get exceptions to be logged to the rails log files. I know I can call logger.error $! to get the first line of the exception logged to the file. But, I want to get the entire trace stack logged as well. How do I log the entire trace back of an exception using the default rails logger?

  • Ashburton88
    Ashburton88 about 12 years
    Am I missing something? logger.error only takes a single argument, so that code does not work...
  • Jonas Fagundes
    Jonas Fagundes about 12 years
    This one doesn't work, use logger.error e.message + "\n " + e.backtrace.join("\n ") instead.
  • Ian Terrell
    Ian Terrell about 12 years
    I could swear the multiple parameters worked 4 years ago, but maybe it didn't. I've updated it to just log the backtrace, which seems to be the most relevant aspect of the question; I trust the reader can figure out multiple logger calls are possible, ditto for string concatenation (or more Ruby-y, interpolation).
  • Rob
    Rob almost 12 years
    It's part of the documentation for Rails 3.2.3. See here: api.rubyonrails.org/classes/ActiveSupport/BacktraceCleaner.h‌​tml
  • James
    James almost 10 years
    don't do join('\n') single quotes :p