了解 slf4j 参数化消息
Understanding slf4j parameterized messages
我正在尝试对我们的应用程序使用 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 APIs 没有魔法。在上面的示例中,如果您只想在实际记录消息时增加 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 有! :-)
使用Java8上的Log4j2API,可以得到这样的代码:
logger.trace("test {}", () -> a++);
这是一个 lambda 表达式,只有在启用跟踪日志记录时才会计算它。因此,您可以在一行中编写以前需要 3 行的内容。
这是而不是slf4jAPI的原因之一。
我正在尝试对我们的应用程序使用 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 APIs 没有魔法。在上面的示例中,如果您只想在实际记录消息时增加 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 有! :-)
使用Java8上的Log4j2API,可以得到这样的代码:
logger.trace("test {}", () -> a++);
这是一个 lambda 表达式,只有在启用跟踪日志记录时才会计算它。因此,您可以在一行中编写以前需要 3 行的内容。
这是