java - 使用 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?
解决方案
查看 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<?>
启用级别时才会调用,使其变得懒惰。
如果您提供Supplier
using lambda、方法引用或通过编写new Supplier() { }
匿名类,则没有区别。您可以看一下lambda 表达式除了节省代码行之外还有其他用途吗?问题来理解这些方法之间的细微差别,但最重要的是它们会很懒惰。
推荐阅读
- linux - 如何知道 SSH 密钥的长度?
- javascript - HTML 标记选择选项值返回为未定义
- java - Java 方法中的时间是如何设置的?
- scikit-learn - 使用经过缩放特征预训练的模型进行单次预测
- javascript - 如何使用 javascript 显示元素?
- javascript - 在 Vue Webpack 中禁用 Transpiler 以便于调试
- r - 注释每组的条形图中的百分比
- java - MySQL 存储过程代码 — “无名为‘CustomerID’的参数”
- odoo - 在odoo js构建仪表板中调用模型的特定表单视图
- crc32 - 循环码是什么意思?CRC 和 Reed-Solomon 循环码是什么?