java - Log4j 2 lambda "lazy logging"

标签 java logging lambda log4j log4j2

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());

这边

  1. 除非调试级别为 TRACE,否则不会调用任何方法
  2. 没有创建 String 对象:Log4j2 在底层使用线程本地 StringBuilder 来避免垃圾
  3. 您避免为字符串连接分配一个临时的 StringBuilder(当您“+”两个字符串时,Java 在幕后做了什么)

关于java - Log4j 2 lambda "lazy logging",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45290484/

相关文章:

java - Camel .beanRef 已弃用 - 现在如何在 Java DSL 路由中访问容器管理的 bean?

java - 获取从单选按钮到组合框的数据搜索

java - 为什么我会收到以下错误以及空构造函数中应该有什么?

logging - Logback - cleanHistoryOnStart 不起作用

tomcat - 如何每天滚动 tomcat 8.0 日志,特别是本地主机日志文件

c++ - C++ Goto vs Std::function lambda? [closed]

lambda - 使用 lambda 和 `reduce` 捕获标签时出现奇怪的非 Lisp 错误

java - 使用 IntelliJ IDEA 将 servlet 部署到本地 Tomcat 服务器

java - SLF4J 按标记过滤日志消息

c# - 正在使用 "out"错误做法