避免 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 调用)相比,其构建成本较低。
假设只有部分调试信息的计算成本很高,那么识别这些情况并为它们创建自定义 类(和相应的对象渲染器)可能是值得的。
几乎在每个项目中,我都使用带有 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 调用)相比,其构建成本较低。 假设只有部分调试信息的计算成本很高,那么识别这些情况并为它们创建自定义 类(和相应的对象渲染器)可能是值得的。