如何使用默认的Rails记录器记录Ruby异常的整个跟踪?

时间:2008-10-23 03:31:34

标签: ruby-on-rails ruby logging

我正在开发rails项目,我正在尝试将例外记录到rails日志文件中。我知道我可以调用logger.error $!来获取记录到文件的异常的第一行。但是,我想要记录整个跟踪堆栈。如何使用默认的rails logger记录异常的整个跟踪?

7 个答案:

答案 0 :(得分:38)

logger.error $!.backtrace

另外,不要忘记你可以

rescue ErrorType => error_name

为您的错误提供除默认$!以外的变量名称。

答案 1 :(得分:17)

rails的方式是

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

答案 2 :(得分:9)

在Rails的更高版本中,只需取消注释RAIL_ROOT / config / initializers / backtrace_silencers.rb中的以下行(如果不存在,则添加此文件):

# Rails.backtrace_cleaner.remove_silencers!

这样,您就可以在异常时获得写入日志的完整回溯。这在v2.3.4中适用于我。

答案 3 :(得分:6)

logger.error caller.join("\n")应该可以解决问题。

答案 4 :(得分:4)

在Rails中,ActionController::Rescue处理它。在我的应用程序控制器操作中,我正在使用此模块中的方法log_error来在日志中进行漂亮格式的回溯:

def foo_action
  # break something in here
rescue
  log_error($!)
  # call firemen
end

答案 5 :(得分:3)

我将如何做到这一点:

http://gist.github.com/127708

以下是Exception #backtrace的ri文档:

http://gist.github.com/127710

请注意,你也可以使用Kernel#caller,它可以为你提供完整的跟踪(减去当前帧)。

http://gist.github.com/127709

另外 - 请注意,如果您尝试捕获所有异常,则应该从Exception中解救,而不是RuntimeError。

答案 6 :(得分:1)

你也可以使用ruby的默认变量,如下所示:

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