了解slf4j参数化消息

时间:2017-05-23 00:15:03

标签: slf4j

我正在尝试使用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

1 个答案:

答案 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的原因之一。