Log4j 2 lambda“懒惰的日志记录”

Ben*_*nch 4 java lambda logging log4j log4j2

所述的Log4j 2手册给出了如何使用lambda表达式为“懒记录”的一个例子:

logger.trace("Some long-running operation returned {}", () -> expensiveOperation());
Run Code Online (Sandbox Code Playgroud)

它还给出了如何使用格式参数来避免不必要的字符串连接的示例:

logger.debug("Logging in user {} with birthday {}", user.getName(), user.getBirthdayCalendar());
Run Code Online (Sandbox Code Playgroud)

我的问题:我可以通过简单地提供一个带有普通字符串连接方法的 lambda 来获得相同的性能优势吗?

logger.trace(() -> "Concatting " + user.getName() + " with " + expensiveOperation());
Run Code Online (Sandbox Code Playgroud)

Rem*_*pma 6

在你的例子中表现最好的是

logger.trace("Concatting {} with {}", () -> user.getName(), () -> expensiveOperation());
Run Code Online (Sandbox Code Playgroud)

这边走

  1. 除非调试级别为 TRACE,否则不会调用任何方法
  2. 没有创建 String 对象:Log4j2 在引擎盖下使用 threadlocal StringBuilder 来避免垃圾
  3. 您避免为字符串连接分配临时 StringBuilder(当您“+”两个字符串时 Java 在幕后所做的事情)