使用 { } 而不是连接来打印日志语句
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) + ".");
我们使用 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) + ".");