Log4j 2.x如何实现惰性参数计算?

2022-09-02 03:33:14

给定 Java 参数求值机制,当禁用 log 时,Log4j 2.x 在用大括号格式化消息时如何实现惰性求值,“以避免参数构造的成本”?

例如:

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

答案 1

我猜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()


答案 2

为了避免参数计算,只需将其包装在lambda中:

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

在这种形式中,供应商将仅在实际伐木之前被要求进行施工。把它想象成一个函数声明。