【发布时间】:2020-02-12 23:23:00
【问题描述】:
log.info(String.format("Execution of method %s finished in %d ms", pointcut.getSignature().getName(), ms))
Sonarlint 显示以下错误:
“前提条件”和日志记录参数不应要求评估
合规解决方案:
logger.log(Level.SEVERE, "出了点问题:{0} ", message);
让我们试试吧:
log.info("Execution of method {0} finished in {1} ms", pointcut.getSignature().getName(), ms);
正确使用Printf风格的格式字符串
合规解决方案:
String.format("先 %s 后 %s", "foo", "bar");
我觉得 sonarlint 只是在嘲笑我。
这是我的判断,但我真的不明白发生了什么或为什么他首先抱怨:
String logMessage = String.format("Execution of method %s finished in %d ms", pointcut.getSignature().getName(), ms);
log.info(logMessage);
有什么想法吗?
【问题讨论】:
-
使用 SLF4J 占位符,
LOGGER.info("Execution of method {} finished in {} ms", variableOne, VariableTwo)slf4j.org/faq.html#logging_performance -
如果你使用的是 slf4j,那么大括号内的索引是不必要的,它不会用参数替换索引,它会按原样打印数字。
-
Sonar 的建议是针对使用 java.util.logging 包的代码。
java.util.logging.Logger使用 MessageFormat 字符串。其他日志框架没有;正如其他 cmets 所说,他们使用空的{}占位符。 -
可能类似于
log.info(() -> String.format("Execution of method %s finished in %d ms", pointcut.getSignature().getName(), ms))(不确定 Sonar 对此有何看法) -
赞成,但是,我认为您应该将问题的标题编辑为更能描述您的问题的内容。