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

给定Java参数评估机制 ,当禁用日志时, Log4j在使用大括号格式化消息时“如何避免参数构造的成本”时,如何实现延迟评估 ?

例如

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

我想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[])中的源代码。