gpt4 book ai didi

slf4j - 了解 slf4j 参数化消息

转载 作者:行者123 更新时间:2023-12-04 17:51:47 24 4
gpt4 key购买 nike

我正在尝试对我们的应用程序使用 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);

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

能否请您帮助我理解查看此行为的 slf4j 参数化消息。

我正在使用 slf4j 1.6.4 和 log4j2.7

最佳答案

这样看: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。

关于slf4j - 了解 slf4j 参数化消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44123877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com