1. 概述
Log4j 2 库从 2.4 版本开始新增了对 Java 8 Lambda 表达式的支持。这些表达式可用于 Logger 接口实现延迟日志记录。
下面我们通过一个简单示例快速了解如何使用这个特性。
关于 Log4j 2 的更多信息,可参考我们的入门文章。
2. 使用 Lambda 表达式实现延迟日志
对于使用日志的应用程序,如果对应的日志级别未启用,避免计算日志消息内容,可能带来性能提升。
首先看一个简单的 TRACE 级别日志语句:
logger.trace("Number is {}", getRandomNumber());
在这个例子中,无论 TRACE 语句是否显示,getRandomNumber() 方法都会被调用来填充日志参数。例如,当日志级别设置为 DEBUG 时,log4j 2 不会记录该消息,但 getRandomNumber() 方法仍会执行。
换句话说,这个方法的执行可能是多余的。
在 Lambda 表达式支持出现之前,我们可以通过显式检查日志级别来避免构造未使用的日志消息:
if (logger.isTraceEnabled()) {
logger.trace("Number is {}", getRandomNumer());
}
这种情况下,getRandomNumber() 方法仅在 TRACE 日志级别启用时才会被调用。这能提升性能,具体效果取决于参数填充方法的执行开销。
使用 Lambda 表达式可以进一步简化上述代码:
logger.trace("Number is {}", () -> getRandomNumber());
Lambda 表达式仅在对应日志级别启用时才会被求值。 这就是所谓的延迟日志记录。
我们还可以在单条日志中使用多个 Lambda 表达式:
logger.trace("Name is {} and age is {}", () -> getName(), () -> getRandomNumber());
3. 总结
✅ 在这个快速教程中,我们了解了如何在 Log4j 2 日志器中使用 Lambda 表达式。
⚠️ 完整示例代码可在 GitHub 项目 中找到。