我正在尝试使用slf4j + log4j2来评估我们的应用程序。我在这些文档中读到了关于slf4j中的参数化消息功能:https://www.slf4j.org/faq.html#logging_performance
要了解此功能,我尝试了以下代码:
int a = 10;
logger.trace("test: " + a++);
logger.error("value of a: " + a);
logger.trace("test {}", a++);
logger.error("value of a " + a);
记录级别设置为ERROR。有了这个,我假设在第一个跟踪日志' a'将会增加,因为它是旧的低效记录方式。但是在第二个跟踪日志中,因为我使用参数化日志记录并且未启用跟踪级别,所以' a ++'也不会得到评估。但看起来它正在评估中。我在2个错误日志中看到值为11和12。
请您帮助我理解查看此行为的slf4j参数化消息。
我正在使用slf4j 1.6.4和log4j2.7
答案 0 :(得分:1)
以这种方式看待:a
变量会在此代码中递增吗?
someObject.someMethod(a++);
答案是肯定的。
Log4j2或slf4j API没有任何魔力。在上面的示例中,如果您只想在实际记录消息时增加a
变量,则需要执行以下操作:
if (logger.isTraceEnabled()) {
logger.trace("test {}", a++);
}
当您记录对象时,故事略有不同。使用参数化日志记录样式,日志记录库可以在格式化消息字符串之前首先检查日志级别。如果未启用日志级别,我们可以避免在参数对象上调用toString()
。
例如:
// always calls toString() on the parameter
logger.trace("a time: " + LocalTime.now());
// only calls toString() if trace is enabled
logger.trace("a time: {}", LocalTime.now());
实际上,我撒谎了一点。 slf4j API可能没有任何魔力,但Log4j2 API确实如此! :-)
在Java 8上使用Log4j2 API,您可以使用以下代码:
logger.trace("test {}", () -> a++);
这是一个lambda表达式,仅在启用了跟踪日志记录时才会计算。所以你可以在一行中写出以前需要3行的内容。
这是consider programming to the Log4j2 API而不是slf4j API的原因之一。