在Java中使用什么级别的异常堆栈跟踪日志记录?

时间:2011-10-07 17:59:50

标签: java exception error-handling stack-trace

我正在寻找有关如何有效记录异常及其堆栈跟踪的最佳实践文档(或您的意见)。当然,假设一个流行的日志框架,如Log4J,SLF4J,java.util.logging等。

我对你应该记录什么级别的堆栈跟踪的意见特别感兴趣。

我听到很少互相矛盾的意见,如:

  • 堆栈跟踪应仅在DEBUG级别记录,而ERROR级别应仅包含“人类可读”错误消息
  • 堆栈跟踪应记录在ERROR级别,以便为操作员提供查找异常根本原因所需的最大信息量

我找到了几篇有趣的文章,但没有一篇涉及这个特定主题:

这可能意味着这些文章的作者与我有同样的担忧: - )

我对你对这个问题的看法非常感兴趣。

3 个答案:

答案 0 :(得分:8)

堆栈跟踪是您在进行故障排除时获得的最有价值的信息。我永远不会冒险在DEBUG级别登录,因为它可能被禁用。我几乎从不想压制堆栈痕迹。

另请注意:

log.error("Houston, we have a problem", ex);

将在标记为ERROR的行中打印人类可读消息,而堆栈跟踪则在该行之后。如果您希望您的错误只是人类可读,请执行grep ERROR

答案 1 :(得分:1)

我不确定这方面的最佳做法建议,但最后,对我来说,归结为: 只有在特殊情况下才能看到例外情况。发明异常的概念是为了让开发人员有机会在内部处理错误。

实际上,我看到的大多数代码甚至都没有尝试处理它们,而是将它们转储到对话框中的日志,sysout(或最糟糕的情况)。我知道,对于开发人员而言,在某些情况下获得完整的stacetrace非常重要。但并非几乎全部。创建自己的异常框架(这绝对是一种最佳实践)可能已足以仅通过类名来确定异常的上下文。

所以我建议你做以下事情:

  1. 创建自己的例外框架
  2. 在邮件中包含特定的错误代码,供您参考
  3. 在ERROR上记录异常消息
  4. 在DEBUG上记录堆栈跟踪
  5. 永远不要向用户显示其中任何一个。而是显示有用的信息。也许包括一种用最少的模糊来报告错误(使用stacktrace)的方法。
  6. 注意:如果您正在编写内部“企业”软件,请忘记我写的所有内容。 : - )

答案 2 :(得分:0)

我认为堆栈跟踪应该根据优先级最佳实践记录在适当的位置。根据异常的性质及其在您的应用程序中的位置,这可能是许多级别之一。请看相关问题: Commons Logging priority best practices