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

标签 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(在日志记录框架自身之上)来执行此策略?

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

最佳答案

恕我直言,即使在大型框架和产品中,关于什么构成良好日志语句级别的日志记录指南也很少见,这主要是由于更重要的指南涉及

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

也就是说,我在最低级别遵循一些一般经验法则:

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

关于java - 在大型 Java 应用程序中标准化日志记录的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1494897/

相关文章:

mysql - 限制mysql日志文件大小

java - 在 Android 上清除内部存储中的文件内容

java - 需要帮助使用 jdbi 在 postgresql 中存储嵌套的 json

java - 如何解决此 iText PDF 错误?

java - Java中如何防止 Debug模式的代码被编译成类?

java - JAXB 中的解码错误

java - 将 Log4j 重定向到特定文件

java - 重力和错误的尺寸

ruby - 在 Ruby 中自动记录异常

c# - 登录 Winform 应用程序