如何在Rails中自动记录异常?

时间:2011-02-20 07:20:16

标签: ruby-on-rails-3

如果控制器操作中存在异常并且使用了rescue,则Rails不会在浏览器中显示异常(这是正常的),也不会将异常写入日志文件。

在这种情况下,有没有办法让Rails将异常写入日志文件?

示例:

def some_action
  2/0
rescue
  #this code is called, but Rails does not write the exception to the log
end

2 个答案:

答案 0 :(得分:3)

你正在拯救这个例外,所以它不会记录它,因为实际上没有任何不好的事情,因为它实际上是“被救出来的”。

您可以将以下代码放在rescue块中,以便在日志中输入一个条目:

logger.warn "Exception rescued!"

您可以阅读有关使用logger in the Rails Guides

的更多信息

答案 1 :(得分:0)

我最终在rescue_from中使用ApplicationController,记录了异常消息并进行了回溯,然后使用params[:controller]params[:action]来确定要重定向到的控制器/操作。

例如,如果PostsController#show例外情况发生,我会从 PostsController#index内的重定向到rescue_from。到目前为止,它一直在 ,因此从redirect_to开始{em>似乎不是一件坏事。rescue_from。时间会让我知道,我敢肯定! (只需要确保我的重定向不会导致一些无限循环!)

只是在某人对此 hack 感兴趣(请自担风险!):

class ApplicationController < ActionController::Base

  def determine_redirect_to_path(controller,action)
    ...
  end

  rescue_from StandardError do |exception|    
    backtrace_size = exception.backtrace.size
    if backtrace_size >= 2 then max_range = 2
    elsif backtrace_size >= 1 then max_range = 1
    end
    if max_range > 0      
      s = "rescued_from:: #{params[:controller]}##{params[:action]}: #{exception.inspect}\n#{exception.backtrace[0..max_range].to_s}\n"
      logger.error s
    end
    redirect_to determine_redirect_to_path(params[:controller],params[:action])
  end      
end