我正在开发rails项目,我正在尝试将例外记录到rails日志文件中。我知道我可以调用logger.error $!
来获取记录到文件的异常的第一行。但是,我想要记录整个跟踪堆栈。如何使用默认的rails logger记录异常的整个跟踪?
答案 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)
我将如何做到这一点:
以下是Exception #backtrace的ri文档:
请注意,你也可以使用Kernel#caller,它可以为你提供完整的跟踪(减去当前帧)。
另外 - 请注意,如果您尝试捕获所有异常,则应该从Exception中解救,而不是RuntimeError。
答案 6 :(得分:1)
你也可以使用ruby的默认变量,如下所示:
logger.error "Your error message. Exception message:#{$!} Stacktrace:#{$@}"