避免 Log4j/Slf4j 启用调试的检查

Avoid Log4j/Slf4j debug enabled checks

几乎在每个项目中,我都使用带有 logback 的 Log4j 或 Slf4j 来记录事件,几乎所有地方我都必须编写类似

的内容
if (log.isDebugEnabled()) {
    log.debug("I'm here doing this stuff");
}

有时您看不到所有这些日志记录代码的实际方法逻辑。 我无法删除 log.isDebugEnabled() 检查,因为即使我使用具有 {} 功能的 Slf4j,如果未启用调试(或任何级别),也可能会计算并删除一些日志信息。

log.debug("Here is the data: {}", calculateDataFromSeveralDataSourcesDuh());

问题来了:有没有办法推迟日志信息的计算,所以只在启用适当的日志级别时才计算,而不检查应用程序代码?

如果我不能使用 Java 8 而我正在使用 Slf4j api,那么 Log4j2 不可用,有什么可能的选择?

通过使用 Log4j2 和 Java 8,您可以轻松地使用 lambda,如 here, so in your case using debug(Message, Supplier) 所述,例如

    log.debug("Here is the data: {}", () -> calculateDataFromSeveralDataSourcesDuh());

如果您不能使用 log4j2 或 java8,请查看 log4j 中 object rendering 的概念。您可以为特定 类 设置您自己的对象渲染器,与渲染它(涉及您的 calculateDataFromSeveralDataSourcesDuh 调用)相比,其构建成本较低。 假设只有部分调试信息的计算成本很高,那么识别这些情况并为它们创建自定义 类(和相应的对象渲染器)可能是值得的。