Log4j如何实现惰性参数评估?

时间:2015-08-24 13:47:45

标签: java log4j lazy-evaluation

鉴于Java argument evaluation mechanism,当使用大括号格式化消息时, Log4j 如何实现lazy evaluation“以避免日志被禁用时参数构建的成本?” p>

e.g。

logger.debug("Entry number: {} is {}", i, entry[i]);

2 个答案:

答案 0 :(得分:15)

我想Log4j的意思是,使用大括号,它们避免在没有必要时构造一个String(例如Level不是Debug):

logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));

即使未记录字符串,也始终计算字符串。

logger.debug("Entry number: {} is {}", i, entry[i]);

Log4j可以先检查Log-Level,然后再决定构建Message-String是否值得。

Log4j使用内部类(org.slf4j.helpers.MessageFormatter),用提供的参数替换每个{}。您可以查看org.slf4j.impl.Log4jLoggerAdapter.debug(String, Object[])

中的源代码

答案 1 :(得分:3)

为避免参数求值,只需将其包装在lambda中即可:

logger.debug(() -> { 
   "Entry number: " + i + " is " + String.valueOf(entry[i])
});

以这种形式,只有在实际记录之前,才会要求供应商进行施工。将其视为函数声明。