【问题标题】:Avoid Log4j/Slf4j debug enabled checks避免启用 Log4j/Slf4j 调试检查
【发布时间】:2016-02-22 19:43:40
【问题描述】:

几乎在每个项目中,我都使用 Log4j 或 Slf4j 和 logback 来记录事件,并且几乎在任何地方我都必须编写类似的东西

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 不可用?

【问题讨论】:

    标签: java logging log4j slf4j


    【解决方案1】:

    通过使用 Log4j2 和 Java 8,您可以轻松地使用 here 中描述的 lambda,因此在您的情况下使用 debug(Message, Supplier),例如

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

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

    【讨论】:

    • 谢谢,这是一个不错的选择。我希望我可以在我当前的项目中使用 Java 8 和 Log4j2。)
    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2012-06-06
    • 2020-07-13
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    相关资源
    最近更新 更多