首页 > 解决方案 > 使用 Log4J2 进行延迟日志记录中的“Lambda 可以替换为方法参考”

问题描述

我想通过在 Log4J2 中使用惰性日志记录来提高日志记录的效率。

这意味着我正在使用 lambdas,它仅在日志级别正确/满足时执行。

例子:

List<Integer> someList = Arrays.asList(1,2,3);
log.info("Size of list is {}.", () -> someList.size());

我的 IDE 告诉我,我可以用方法引用替换这个符号,如下所示:

log.info("Size of list is {}.", someList::size);

现在的问题是:这种方法(方法参考)是否仍然具有惰性日志记录的好处,即仅在日志记录中执行昂贵的计算任务,当日志级别被满足时,或者我是否失去了全部好处,当我' m 没有明确使用 lambda?

标签: javalogginglambda

解决方案


查看 Log4j2 源代码,您会发现Logger该类正在定义Supplier<?>以使其变得懒惰,例如在您可以找到的AbstractLogger.logIfEnabled()一种方法中:

@Override
public void logIfEnabled(final String fqcn, final Level level, final Marker marker, final String message,
            final Supplier<?>... paramSuppliers) {
        if (isEnabled(level, marker, message)) {
            logMessage(fqcn, level, marker, message, paramSuppliers);
        }
}

只有在Supplier<?>启用级别时才会调用,使其变得懒惰。

如果您提供Supplierusing lambda、方法引用或通过编写new Supplier() { }匿名类,则没有区别。您可以看一下lambda 表达式除了节省代码行之外还有其他用途吗?问题来理解这些方法之间的细微差别,但最重要的是它们会很懒惰。


推荐阅读