使用 { } 而不是连接来打印日志语句

printing log statements using { } instead of concatenating

我们使用 slf4j 进行日志记录。我看到有时日志语句提供为:

log.info("Something like this {}", variable);

然而,其他时候,我们连接:

log.info("Something like this " + variable);

这两个有什么区别?

第一种情况

log.info("Something like this {}", variable);

第一个info参数是模板字符串。在内部 log4j 将使用其余参数按相应顺序填充占位符。

第二种情况

log.info("Something like this " + variable);

StringBuilder 将用于 assemble 消息字符串,结果将用作您的日志消息。

使用第一个变体至少有两个原因:

1) 除非要写入appender,否则不处理消息。

使用模板字符串会延迟消息处理,只有在实际写入日志时才会进行渲染(javadoc ref)。

在第二种情况下,即使您的日志级别不足以打印日志,消息也会 assembled。

2) 提高了可读性

要感受差异,您应该考虑更复杂的示例:

log.info("A is {} and B is {}. The difference is {}.", a, b, a-b);

log.info("A is " + a + " and B is " + b + ". The difference is " + (a-b) + ".");