为什么sonarqube要为带有message和throwable的log方法添加“not enough arguments.”?

uklbhaso  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(441)

我正在使用 self4j 用于放置记录器

LOGGER.info("Exception occurred while saving data {}", be);

但上述声明显示声纳问题 Not enough arguments. 在eclipse中使用sonarlint5.3.1
如果我更新上面的日志如下,那么它没有显示任何问题

LOGGER.info("Exception occurred while saving data", be);

或者,如果我提取任何常量文件中的日志字符串,那么它也可以正常工作

private static final String LOG_STR = "Exception occurred while saving data {}";

LOGGER.info(LOG_STR , be);

为什么它在不同的场景中表现不同?

zour9fqk

zour9fqk1#

这篇文章有两个问题。

为什么带有{}的消息没有足够的参数。?

slf4j logger类对每个日志方法都有一些变体:
信息(java.lang.string、java.lang.object)
信息(java.lang.string,java.lang.object…)
信息(java.lang.string、java.lang.throwable)
第一个和第二个变体接收一条消息和参数,这些消息和参数将被注入其中。第三个接受静态消息,因为异常的处理方式不同。我相信 be 是个例外。这意味着:

// issue: not enough arguments
LOGGER.info("Exception occurred while saving data {}", be);

执行第三个不支持 {} . 如果您只想显示异常消息并隐藏堆栈跟踪(当您使用第三个变量时,默认情况下会记录该跟踪)-您应该调用 toString()be .

// okay, call info(String, String), so one parameter is available
LOGGER.info("Exception occurred while saving data {}", be.toString());

为什么常量代码不产生错误?

我相信规则中有一个bug,你应该在sonarsource社区报告它。

相关问题