SonarQube为什么添加“参数不足”消息和Throwable的日志方法?

问题描述

我正在使用self4j放置记录器

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

但是以上显示声纳问题的声明Not enough arguments.在日食中使用声纳皮棉5.3.1

如果我按如下所示在Logger上方进行更新,则它没有显示任何问题

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

或者如果我将记录器字符串提取到任何常量文件中,那么它也可以正常工作

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

LOGGER.info(LOG_STR,be);

为什么在不同情况下其行为不同?

解决方法

这篇文章有两个问题。

为什么带有{}的消息具有Not enough arguments.

SLF4J Logger类的每个日志方法都有一些变体:

  1. info(java.lang.String,java.lang.Object)
  2. info(java.lang.String,java.lang.Object...)
  3. info(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());

为什么带有常量的代码不会产生错误?

我相信规则中存在错误,您应该在SonarSource Community上报告该错误。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...