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?

- 91,102
- 13
- 100
- 152

- 13,338
- 15
- 58
- 74
7 Answers
logger.error $!.backtrace
Also, don't forget you can
rescue ErrorType => error_name
to give your error a variable name other than the default $!
.

- 10,667
- 11
- 45
- 66
-
1Am I missing something? logger.error only takes a single argument, so that code does not work... – Robin Clowers Feb 29 '12 at 22:39
-
21This one doesn't work, use `logger.error e.message + "\n " + e.backtrace.join("\n ")` instead. – Jonas Fagundes May 05 '12 at 06:31
-
3I 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). – Ian Terrell May 05 '12 at 14:44
-
1don't do join('\n') single quotes :p – James Jul 25 '14 at 15:55
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

- 3,306
- 1
- 22
- 16
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.

- 1,733
- 16
- 20
-
1It's part of the documentation for Rails 3.2.3. See here: http://api.rubyonrails.org/classes/ActiveSupport/BacktraceCleaner.html – Rob May 25 '12 at 15:13
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

- 5,200
- 2
- 21
- 20
Here's how I would do it:
Here's the ri documentation for Exception#backtrace:
Note that you could also use Kernel#caller, which gives you the full trace (minus the curent frame) as well.
Also - Note that if you are trying to catch all exceptions, you should rescue from Exception, not RuntimeError.

- 319
- 2
- 5
You can also use ruby's default variables, like this:
logger.error "Your error message. Exception message:#{$!} Stacktrace:#{$@}"

- 11
- 1