Log4j 2 lambda" lazy logging"

时间:2017-07-24 21:36:53

标签: java logging lambda log4j log4j2

Log4j 2 manual举例说明如何使用lambdas进行"懒惰记录":

logger.trace("Some long-running operation returned {}", () -> expensiveOperation());

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

logger.debug("Logging in user {} with birthday {}", user.getName(), user.getBirthdayCalendar());

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

logger.trace(() -> "Concatting " + user.getName() + " with " + expensiveOperation());

1 个答案:

答案 0 :(得分:2)

您示例中的最佳效果是

logger.trace("Concatting {} with {}", () -> user.getName(), () -> expensiveOperation());

这样

  1. 除非调试级别为TRACE
  2. ,否则不会调用任何方法
  3. 没有创建String对象:Log4j2使用引擎盖下的threadlocal StringBuilder无垃圾
  4. 你避免为字符串连接分配一个临时的StringBuilder(当你" +"两个字符串时,Java会做什么)