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

时间:2010-08-14 17:16:13

标签: ruby-on-rails ruby

我一直在试图找出记录堆栈跟踪的正确方法。我遇到了this链接,指出 logger.error $!,$!。backtrace 是要走的路,但这对我不起作用 log_error 。根据文档,我没有看到如何将第二个参数传递给error方法仍然可行,因为rails使用的ruby logger只接受一个参数。

奇怪(或许没有)第二个论点在没有任何翻译投诉的情况下被接受。但是,我传递给它的任何内容都会被忽略。

任何人都能解释我错过的东西吗?任何关于错误的第二个论点是什么以及吃什么的见解?

3 个答案:

答案 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