【发布时间】:2010-09-18 17:04:17
【问题描述】:
我正在研究 rails 项目,我正在尝试将异常记录到 rails 日志文件。我知道我可以调用logger.error $! 将异常的第一行记录到文件中。但是,我也想记录整个跟踪堆栈。如何使用默认的 Rails 记录器记录异常的整个回溯?
【问题讨论】:
标签: ruby-on-rails ruby logging
我正在研究 rails 项目,我正在尝试将异常记录到 rails 日志文件。我知道我可以调用logger.error $! 将异常的第一行记录到文件中。但是,我也想记录整个跟踪堆栈。如何使用默认的 Rails 记录器记录异常的整个回溯?
【问题讨论】:
标签: ruby-on-rails ruby logging
logger.error $!.backtrace
还有,别忘了你可以
rescue ErrorType => error_name
为您的错误提供一个不同于默认 $! 的变量名称。
【讨论】:
logger.error e.message + "\n " + e.backtrace.join("\n ")。
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
【讨论】:
在更高版本的 Rails 中,只需取消注释 RAIL_ROOT/config/initializers/backtrace_silencers.rb 中的以下行(如果该文件不存在,则自行添加):
# Rails.backtrace_cleaner.remove_silencers!
通过这种方式,您可以在异常情况下将完整的回溯写入日志。这在 v2.3.4 中适用于我。
【讨论】:
logger.error caller.join("\n") 应该可以解决问题。
【讨论】:
在 Rails 中,ActionController::Rescue 处理它。在我的应用程序控制器操作中,我使用此模块中的方法 log_error 在日志中进行漂亮格式的回溯:
def foo_action
# break something in here
rescue
log_error($!)
# call firemen
end
【讨论】:
我会这样做:
这是 Exception#backtrace 的 ri 文档:
请注意,您也可以使用 Kernel#caller,它也可以为您提供完整的跟踪(减去当前帧)。
另外 - 请注意,如果您试图捕获 所有 异常,您应该从 Exception 中拯救,而不是 RuntimeError。
【讨论】:
你也可以使用 ruby 的默认变量,像这样:
logger.error "Your error message. Exception message:#{$!} Stacktrace:#{$@}"
【讨论】: