Log4j 2.x如何实现惰性参数计算?
2022-09-02 03:33:14
给定 Java 参数求值机制,当禁用 log 时,Log4j 2.x 在用大括号格式化消息时如何实现惰性求值,“以避免参数构造的成本”?
例如:
logger.debug("Entry number: {} is {}", i, entry[i]);
给定 Java 参数求值机制,当禁用 log 时,Log4j 2.x 在用大括号格式化消息时如何实现惰性求值,“以避免参数构造的成本”?
例如:
logger.debug("Entry number: {} is {}", i, entry[i]);
我猜Log4j的意思是,使用大括号,它们可以避免在不需要时构造字符串(例如,Level不是Debug):
跟
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
始终计算完整的消息,即使它不会被记录。
跟
logger.debug("Entry number: {} is {}", i, entry[i]);
Log4j可以先检查日志级别,然后决定它是否值得构造消息字符串。这样可以节省字符串串联所需的资源。它只会在实际创建消息时调用提供的对象,从而节省进一步的计算成本。toString()
Log4j 使用一个内部类 (),它将 every 替换为提供的参数。它还将捕获 引发的异常并报告这些故障。org.apache.logging.log4j.message.ParameterFormatter
{}
toString()
为了避免参数计算,只需将其包装在lambda中:
logger.debug(() -> {
"Entry number: " + i + " is " + String.valueOf(entry[i])
});
在这种形式中,供应商将仅在实际伐木之前被要求进行施工。把它想象成一个函数声明。