在大型Java应用程序中标准化日志记录的方法

时间:2009-09-29 20:56:45

标签: java logging

在大型应用程序中,日志记录是必不可少的,但是当许多开发人员处理代码时,日志会变得混乱。有人可能写道:

log.info("Loaded " + rowCount + " recodrs from the database.");

另一个人可能会这样做:

log.debug("Records read={}", rowCount);

第三位开发人员可能认为这是正确的方法:

log.trace("Record(s) read: " + NumberFormat.getInstance().format(rowCount)
          + ", values: " + values);

这将导致难以阅读的日志,并且难以解析。

您可以为开发人员提供哪些指导,以生成有可能保持一致且实际可供其他人使用的日志?关于伐木的政策是否有益?如果是这样,它应包括什么?是否应该有一个API(在日志框架之上)来强制执行此策略?

我也很好奇如何使代码看起来很相似,但更重要的问题是关于实际输出。

3 个答案:

答案 0 :(得分:6)

关于什么构成良好的日志声明级别的IMHO日志指南在大型框架和产品中很少见,主要是由于涉及更重要的指导原则

  • 日志详细程度 - 更详细的语句应作为调试语句出现,对log.debug()的调用应该通过调用来检查是否已启用调试。开发人员通常需要区分FATAL,ERROR,INFO,DEBUG和TRACE正确 - 并非所有异常都是致命的,并非所有消息都是提供信息的。
  • 使用TRACE或等效物 - 这应该保留用于执行流程。理想情况下,不需要其他日志语句来指示控制流程。
  • DEBUG vs INFO - DEBUG语句通常用于开发人员和支持人员; INFO通常供用户和管理员使用。
  • 覆盖toString() - 它有助于记录复杂对象的状态

那就是说,我遵循最低级别的一些通用拇指规则:

  • 按原样记录数据,不进行格式化。这样,在出现错误的情况下,我知道造成问题的数据是什么,而不是同时怀疑记录器,格式化程序和应用程序。
  • 除非您在打开DEBUG或TRACE的情况下运行,否则请避免创建太多的String对象。简而言之,避免连接太多字符串。即使log4j最终检查是否启用了DEBUG,也会创建String对象,这就是日志调用包装很重要的原因。 slf4j helps avoids this via the use of parameterized messages

答案 1 :(得分:3)

通过开发人员在构建日志语句时引用的API或字符串格式来标准化消息。他们不应该在程序中输入这样的文本,即使是日志记录也是如此,原因就在于你调出的原因。当然,这意味着您还需要一个政策,并进行审核以确保该政策得到尊重。

答案 2 :(得分:2)

您可以使用AOP(AspectJ是最好的)来记录传递给方法的内容。你甚至可以只对方法进行切入点,所以它不会太多日志记录。您可以编写类似@Loggable的方法注释并在其上设置切入点,因此每个带有这些参数的方法都会被记录。

我认为方面是最好的方式。

example