Log4j 2 manual给出了如何使用 lambda 进行“惰性日志记录”的示例:
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());
最佳答案
在你的例子中表现最好的是
logger.trace("Concatting {} with {}", () -> user.getName(), () -> expensiveOperation());
这边
- 除非调试级别为 TRACE,否则不会调用任何方法
- 没有创建 String 对象:Log4j2 在底层使用线程本地 StringBuilder 来避免垃圾
- 您避免为字符串连接分配一个临时的 StringBuilder(当您“+”两个字符串时,Java 在幕后做了什么)
关于java - Log4j 2 lambda "lazy logging",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45290484/