Java 如何在记录器语句中检测字符串连接?

Java 如何在记录器语句中检测字符串连接?,java,maven,checkstyle,findbugs,pmd,Java,Maven,Checkstyle,Findbugs,Pmd,有没有办法配置Checkstyle、PMD或FindBugs Maven插件来检测如下代码: logger.debug("string" + stringVariable); 而不是: logger.debug("format string {}", stringVariable); 像这样做 提及 或 提及 好问题 我刚刚发现了一系列关于findbugs的附加规则,涵盖了您的案例(以及其他一些): 检查SLF4J_FORMAT_SHOULD_CONST应允许您在格式字符串中查找字符串连接。

有没有办法配置Checkstyle、PMD或FindBugs Maven插件来检测如下代码:

logger.debug("string" + stringVariable);
而不是:

logger.debug("format string {}", stringVariable);
像这样做

提及

提及

好问题

我刚刚发现了一系列关于findbugs的附加规则,涵盖了您的案例(以及其他一些):


检查
SLF4J_FORMAT_SHOULD_CONST
应允许您在格式字符串中查找字符串连接。

除了Slava的帖子(最适合您的需要)之外,findbugs中还有检查字符串问题的方法(例如SBSC_使用_STRINGBUFFER_连接)以及检查该问题的模式。与您相关的信息应该是:

  • ISB_TOSTRING_追加
  • ISB\u无效\u字符串\u缓冲
  • ISB_空字符串_追加
  • ITC_继承_类型_检查

FB contrib几乎为findbugs添加了200个bug模式,因此它真的是值得的。

4年后,但作为PMD的问题也值得发布。以下是使用XPath创建PMD规则的语法(配置规则的方法非常简单):


用户界面!两条注释:1)带“+”的字符串连接通常使用StringBuilder编译,这有时是可以接受的。在这种情况下使用String.format会使情况变得更糟,因为这种格式比简单的串联更复杂。2) 问题在于如何在记录器调用中检测字符串连接,而不是如何更好地处理它们。事实上,这个问题已经包含了一个记录器的示例,它已经实现了格式化。在这里找到了解释:性能()
logger.debug(String.format("format string %s ", stringVariable));
logger.debug(MessageFormat.format("format string {0}", new Object[]{stringVariable }));
//PrimaryPrefix/
Name[matches(@Image,'logger.trace|logger.debug|logger.info|logger.warn|logger.error|logger.fatal')]
/../../PrimarySuffix//ArgumentList/*[1]//AdditiveExpression