鉴于Java argument evaluation mechanism,当使用大括号格式化消息时, Log4j 如何实现lazy evaluation“以避免日志被禁用时参数构建的成本?” p>
e.g。
logger.debug("Entry number: {} is {}", i, entry[i]);
答案 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])
});
以这种形式,只有在实际记录之前,才会要求供应商进行施工。将其视为函数声明。