2017-05-23 57 views
1

我正在尝试使用slf4j + log4j2来评估我们的应用程序。我在这样的有关参数信息的文件阅读功能在SLF4J:https://www.slf4j.org/faq.html#logging_performance了解slf4j参数化消息

要理解这个功能我试过这段代码:

int a = 10; 
logger.trace("test: " + a++); 
logger.error("value of a: " + a); 
logger.trace("test {}", a++); 
logger.error("value of a " + a); 

日志记录级别设置为错误。因此,我假定在第一个跟踪日志中,'a'将会增加,因为这是旧的低效率日志记录方式。但在第二次跟踪日志中,因为我使用参数化日志记录,并且未启用跟踪级别,所以'a ++'也不会被评估。但看起来它正在被评估。我在2个错误日志中将值看作11和12。

你能帮我理解看这个行为的slf4j参数化消息吗?

我使用SLF4J 1.6.4和log4j2.7

回答

0

看它是这样的:将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的原因之一。

+0

非常感谢Remko ..ya的解释,我早些时候看了你的其他文章并评估了log4j2 api。 – anuragz