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

我一直在试图找出正确的方法来记录堆栈跟踪。我偶然发现了 这个链接,其中指出,Logger. error $! ,$! . backtrace的方式去,但这不工作,我 Log _ error做。根据文档,我不知道如何将第二个参数传递给 error 方法,因为 Rails 使用的 ruby 日志记录器只接受一个参数。

奇怪的是(或许不是) ,第二个论点被接受了,而没有任何译员的抱怨。但是我传递给它的任何东西都会被忽略。

有人能解释一下我错过了什么吗?对于错误的第二个论点是什么,以及错误的根源是什么,有什么见解吗?

105315 次浏览

如果查看 ActiveSupport 中 BufferedLogger 类的源代码,您将看到第二个参数是“ program name”。只有当第一个参数为 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

这就是答案。

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

根据 kuboon 的回答,我发现这种日志格式对于分类日志文件中的错误非常通用和有用:

begin
raise
rescue StandardError => e
Rails.logger.error (["#{self.class} - #{e.class}: #{e.message}"]+e.backtrace).join("\n")
end