Josh Moore
Josh Moore

Reputation: 13548

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

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?

Upvotes: 37

Views: 34622

Answers (7)

user3223833
user3223833

Reputation: 11

You can also use ruby's default variables, like this:

logger.error "Your error message. Exception message:#{$!} Stacktrace:#{$@}"

Upvotes: 1

Ian Terrell
Ian Terrell

Reputation: 10866

logger.error $!.backtrace

Also, don't forget you can

rescue ErrorType => error_name

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

Upvotes: 38

mxgrn
mxgrn

Reputation: 1778

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.

Upvotes: 11

user52804
user52804

Reputation: 319

Here's how I would do it:

http://gist.github.com/127708

Here's the ri documentation for Exception#backtrace:

http://gist.github.com/127710

Note that you could also use Kernel#caller, which gives you the full trace (minus the curent frame) as well.

http://gist.github.com/127709

Also - Note that if you are trying to catch all exceptions, you should rescue from Exception, not RuntimeError.

Upvotes: 3

Priit
Priit

Reputation: 5248

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

Upvotes: 4

Matt Burke
Matt Burke

Reputation: 3326

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

Upvotes: 18

Redbeard
Redbeard

Reputation: 1018

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

Upvotes: 7

Related Questions