我一直在试图找出记录堆栈跟踪的正确方法。我遇到了this链接,指出 logger.error $!,$!。backtrace 是要走的路,但这对我不起作用 log_error 。根据文档,我没有看到如何将第二个参数传递给error方法仍然可行,因为rails使用的ruby logger只接受一个参数。
奇怪(或许没有)第二个论点在没有任何翻译投诉的情况下被接受。但是,我传递给它的任何内容都会被忽略。
任何人都能解释我错过的东西吗?任何关于错误的第二个论点是什么以及吃什么的见解?
答案 0 :(得分:191)
如果你在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
答案 1 :(得分:12)
这就是答案。
begin
raise
rescue => e
logger.error ([e.message]+e.backtrace).join($/)
end
答案 2 :(得分:0)
根据 kuboon 的回答,我发现这种日志记录格式是通用的,对于对我的日志文件中的错误进行分类非常有用:
begin
raise
rescue StandardError => e
Rails.logger.error (["#{self.class} - #{e.class}: #{e.message}"]+e.backtrace).join("\n")
end