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

Lór*_*tér 6 java logging

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

log.info("Loaded " + rowCount + " recodrs from the database.");
Run Code Online (Sandbox Code Playgroud)

另一个可能做的事情如下:

log.debug("Records read={}", rowCount);
Run Code Online (Sandbox Code Playgroud)

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

log.trace("Record(s) read: " + NumberFormat.getInstance().format(rowCount)
          + ", values: " + values);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Vin*_*lds 6

即使在大型框架和产品中,恕我直言的关于什么构成良好的日志声明级别的日志指南也很少见,主要是由于更重要的指导原则

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

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

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