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

后端 未结 7 697
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-31 08:29

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

相关标签:
7条回答
  • 2021-01-31 08:50

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

    logger.error "Your error message. Exception message:#{$!} Stacktrace:#{$@}"
    
    0 讨论(0)
  • 2021-01-31 08:53

    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.

    0 讨论(0)
  • 2021-01-31 08:59
    logger.error $!.backtrace
    

    Also, don't forget you can

    rescue ErrorType => error_name
    

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

    0 讨论(0)
  • 2021-01-31 09:09

    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.

    0 讨论(0)
  • 2021-01-31 09:11

    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
    
    0 讨论(0)
  • 2021-01-31 09:12

    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
    
    0 讨论(0)
提交回复
热议问题