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 项目 中找到。


原始标题:Log4j 2 and Lambda Expressions