如何用jqassistant验证Logback为唯一日志实现?规则失效排查
问题原因分析
你的规则不生效且出现警告,核心原因是规则依赖的jqassistant模型节点、关系、属性与2.4.0版本不匹配,加上逻辑覆盖不全:
- 节点类型错误:jqassistant 2.4.0中maven项目的核心节点是
maven:Module,而非旧版本可能用到的Application,导致规则匹配不到任何项目节点,自然不会触发校验。 - 关系类型错误:maven模块与依赖的关联关系是
maven:HAS_DEPENDENCY,而非你规则中使用的OF_TYPE,这会导致无法扫描到项目依赖。 - 属性引用错误:警告中提到的
groupId属性不存在,大概率是你规则中属性的路径错误(比如误写为application.groupId),实际maven依赖的groupId属性属于maven:Dependency节点,应写为dependency.groupId。 - 逻辑覆盖不全:可能未明确区分SLF4J门面(允许存在)与其他日志实现(禁止存在),或者未覆盖子模块的依赖扫描。
修正后的规则配置
1. 调整规则文件(示例:src/main/resources/jqassistant/rules/logging-constraints.yml)
rules: logging: only-logback-allowed: description: 项目仅允许使用SLF4J门面与Logback作为日志实现,禁止其他日志框架(如Log4j2、Log4j1、Commons-Logging) severity: CRITICAL cypher: | MATCH (module:maven:Module)-[:maven:HAS_DEPENDENCY]->(dependency:maven:Dependency) WHERE # 排除允许的日志依赖:SLF4J门面、Logback核心/扩展 NOT ( (dependency.groupId = 'org.slf4j' AND dependency.artifactId STARTS WITH 'slf4j-') OR (dependency.groupId = 'ch.qos.logback') ) # 匹配禁止的日志实现 AND ( dependency.groupId IN ['org.apache.logging.log4j', 'log4j', 'org.apache.log4j', 'commons-logging'] OR dependency.artifactId IN ['log4j', 'log4j-core', 'commons-logging', 'jcl-over-slf4j'] ) RETURN module.artifactId AS 模块名称, dependency.groupId AS 禁止的GroupId, dependency.artifactId AS 禁止的ArtifactId, dependency.version AS 版本号
2. 修正.jqassistant.yml配置(确保规则加载与扫描范围正确)
scan: include: - "**/pom.xml" exclude: - "**/target/**" rules: include: - "classpath:/jqassistant/rules/**/*.yml"
验证步骤
执行maven命令触发分析:
mvn jqassistant:analyze
如果项目中存在Log4j2等禁止的依赖,分析会直接失败,并输出违规的模块与依赖信息;若仅包含SLF4J与Logback,则分析成功。
额外说明
- 可根据项目需求调整Cypher查询中的允许/禁止列表,比如添加其他需要排除的日志框架。
- 若存在间接依赖(比如第三方库引入Log4j2),该规则同样会扫描到,因为jqassistant会解析完整的依赖树。
内容的提问来源于stack exchange,提问作者Rensykes
相关产品推荐
相关产品推荐

