问题描述
我正在使用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类的每个日志方法都有一些变体:
- info(java.lang.String,java.lang.Object)
- info(java.lang.String,java.lang.Object...)
- 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上报告该错误。