Rails:记录异常的整个堆栈跟踪


110

我一直在尝试找出记录堆栈跟踪的正确方法。我碰到了这个链接,链接指出logger.error $!,$ !. backtrace行之有效的方法,但log_error对我而言不起作用。根据文档,我看不到如何将第二个参数传递给错误方法,因为rails使用的ruby记录器仅接受一个参数。

奇怪地(或可能不是)第二个参数被接受而没有任何口译员的抱怨。但是,我传递给它的任何内容都将被忽略。

谁能解释我所缺少的吗?对错误的第二个参数是什么意思以及它在吃什么的任何见解?

Answers:


204

如果在ActiveSupport中查看BufferedLogger类的源代码,您会看到第二个参数是'progname'。仅当第一个参数为nil并且您没有给它任何块或该块返回非真值时才使用此参数。

本质上,您不能使用第二个参数来输出其他内容。

您想要做的事情更类似于:

begin
  raise
rescue => e
  logger.error e.message
  logger.error e.backtrace.join("\n")
end

根据您的日志记录设置方式,最好遍历回溯的每一行并分别打印出来,因为某些日志记录器不会输出换行符,在这种情况下,您可以执行以下操作:

begin
  raise
rescue => e
  logger.error e.message
  e.backtrace.each { |line| logger.error line }
end

5
我将使用“ \ r \ n”加入以维护跨平台兼容性。
James Watkins 2014年

10
您会使用$/跨平台兼容吗?让Ruby来处理它,因为\r\n它仅针对少数平台。
vgoff 2015年

12
由于多次调用logger都不是线程安全的,因此您可能会拆分消息且无法读取消息。虽然记录器本身是线程安全的。通常,我将我的消息加入一个字符串然后记录下来。
莫罗佐夫

当时记录器似乎不支持日志条目中的换行符,因此拆分是的,但是,您是对的,您应该意识到这种方法的局限性
darkliquid

+1 @JackWatson绝对奇怪的答案,因为它是非线程安全的。这很重要,因为我们在这里谈论的是网络应用
EvAlex

16

这就是答案。

begin
  raise
rescue => e
  logger.error ([e.message]+e.backtrace).join($/)
end

9
更少的标点符号:Rails.logger.error [e.message, *e.backtrace].join($/)
artm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.