如何为log4j配置检查样式

4xrmg8kj  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(127)

我想禁止这样的代码:

private static final Logger LOGGER = LogManager.getLogger(...)
...
...

LOGGER.info("User(%s) not found.", userId);

不如这样做:

LOGGER.info("User({}) not found.", userId);

如何配置checkstyle来捕获这些错误?

f45qwnt8

f45qwnt81#

可能没有标准检查来禁止此操作(至少in the official page)。
对于99%的情况,以下基于正则表达式(RegexpSingleLineJava)的自定义检查将起作用:

<module name="RegexpSinglelineJava">
  <property name="format" value="(LOGGER|LOG|logger|log)\.[a-z]+\(.*%s"/>
  <property name="ignoreComments" value="true"/>
  <property name="message" value="Formatting with %s in Log4J log strings is not allowed, use {} instead" />
</module>

regexp定位一个logger,后面跟着一个点、多个字母(例如infowarnerror等)、左大括号和%s,后面跟着一些任意字符。注解被忽略。

限制:

  • 如果%sLOGGER不在同一行,checkstyle不会捕捉到错误(但是,格式字符串通常和LOGGER在同一行,不像参数);
  • 如果logger示例有一些外来名称(不像(LOGGER|LOG|logger|log)),checkstyle将不会捕获错误;
  • 如果在同一行上有多个语句,checkstyle可能会捕获误报:
LOGGER.warn("This is an extremely awful code style."); String str = String.format("%s", "someText");

编写一个自定义的Checkstyle检查可能有助于克服这些限制,但我不确定在真实的项目中是否值得。如果目标是告诉开发人员停止在日志中使用%s,而不是找到这种情况的 * 每一个单一的事件 *,那么使用单行正则表达式检查应该是完全可以的。

相关问题