英文:
Why does SonarQube add "Not enough arguments." for log methods with message and Throwable?
问题
我正在使用 self4j
进行日志记录:
LOGGER.info("在保存数据时发生异常 {}", be);
但上述语句显示了 Sonar 问题 参数不足
。在 Eclipse 中使用 Sonar Lint 5.3.1。
如果我将上面的 Logger 更新如下,则不会显示任何问题:
LOGGER.info("在保存数据时发生异常", be);
或者,如果我将日志记录字符串提取到任何常量文件中,那么也能正常工作:
private static final String LOG_STR = "在保存数据时发生异常 {}";
LOGGER.info(LOG_STR, be);
为什么在不同的情况下它的行为不同呢?
英文:
I am using self4j
for putting logger
LOGGER.info("Exception occurred while saving data {}", be);
But above statement showing sonar issue Not enough arguments.
Using sonar lint 5.3.1 in eclipse
If I update above Logger as below then its not showing any issue
LOGGER.info("Exception occurred while saving data", be);
Or if I extract logger string in any constant file then its also working fine
private static final String LOG_STR = "Exception occurred while saving data {}";
LOGGER.info(LOG_STR , be);
Why its behaving different in different scenario?
答案1
得分: 2
这篇帖子中有两个问题。
为什么带有{}
的消息会显示Not enough arguments.
?
SLF4J Logger 类为每个日志方法提供了几种变体:
- info(java.lang.String,java.lang.Object)
- info(java.lang.String,java.lang.Object...)
- info(java.lang.String,java.lang.Throwable)
第一种和第二种变体接受一个消息和要注入其中的参数。第三种接受静态消息,因为异常的处理方式不同。我相信 be
是一个异常。这意味着在这里:
// 问题:参数不足
LOGGER.info("保存数据时发生异常 {}", be);
你使用了不支持{}
的第三个选项。如果你只想显示异常消息并隐藏堆栈跟踪(在使用第三种变体时默认会记录堆栈跟踪),你应该在 be
上调用 toString()
。
// 好的,调用info(String, String),这样一个参数就可用了
LOGGER.info("保存数据时发生异常 {}", be.toString());
为什么带有常量的代码不会产生错误?
我相信规则中存在一个错误,你应该在 SonarSource 社区 上报告它。
英文:
There are two questions in this post.
Why message with {}
has Not enough arguments.
?
SLF4J Logger class has a few variants for every log method:
- info(java.lang.String,java.lang.Object)
- info(java.lang.String,java.lang.Object...)
- info(java.lang.String,java.lang.Throwable)
The first and the second variants take a message and parameters which will be injected into it. The third takes a static message because exceptions are handled in a different way. I believe be
is an exception. It means that here:
// issue: not enough arguments
LOGGER.info("Exception occurred while saving data {}", be);
You execute the third option which doesn't support {}
. If you want to display only exception message and hide the stack trace (which will be logged by default when you use the third variant) - you should call toString()
on be
.
// okay, call info(String, String), so one parameter is available
LOGGER.info("Exception occurred while saving data {}", be.toString());
Why the code with constant doesn't produce an error?
I believe there is a bug in the rule, which you should report it on SonarSource Community.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论