Karate日志文件未生成问题排查求助
问题描述
我之前查过类似问题但没解决,用以下TestRunner运行Karate的abc.feature文件:
void testParallel() throws IOException { Runner.path("classpath:Features/abc.feature") .tags("@abc") .hook(new ReportportalHook()) .parallel(1); }
执行完成后target目录未生成日志文件,项目结构如下:
src/test/java | |--feature--abc.feature |--TestRunner.java |--logback-test.xml
已从指定GitHub地址复制logback-test.xml到src/test/java目录,同时遇到SLF4J错误:
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier.
SLF4J: Ignoring binding found at [jar:file:/C:/Users/myComp/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Ignoring binding found at [jar:file:/E:/workspace/proj/Final/lib/DigitalSigner.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Ignoring binding found at [jar:file:/E:/workspace/proj/Final/lib/logback-classic-1.1.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See https://www.slf4j.org/codes.html#ignoredBindings for an explanation.
当前pom文件依赖配置:
<dependency> <groupId>slf4j-api-1.7.5</groupId> <artifactId>slf4j-api-1.7.5</artifactId> <scope>system</scope> <version>1.0</version> <systemPath>${project.basedir}/lib/slf4j-api-1.7.5.jar</systemPath> </dependency> <dependency> <groupId>slf4j-log4j12-1.7.5</groupId> <artifactId>slf4j-log4j12-1.7.5</artifactId> <scope>system</scope> <version>1.0</version> <systemPath>${project.basedir}/lib/slf4j-log4j12-1.7.5.jar</systemPath> </dependency>
问题根源及解决步骤
1. 修正SLF4J依赖配置错误
你的pom依赖存在两个核心问题:
groupId和artifactId格式错误:正确的SLF4J依赖坐标不是把版本号嵌入其中,标准坐标为groupId: org.slf4j,artifactId: slf4j-api/slf4j-log4j12。- 使用
systemscope会跳过Maven依赖管理,极易引发版本冲突,不建议使用。
替换为标准Maven依赖(以Logback绑定为例,Karate官方推荐):
<!-- SLF4J API 1.7.x系列最新兼容版 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> <scope>test</scope> </dependency> <!-- Logback日志实现绑定 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> <scope>test</scope> </dependency>
若坚持使用log4j12绑定,替换为:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.36</version> <scope>test</scope> </dependency>
2. 调整logback配置文件位置
Logback默认从src/test/resources目录加载配置文件,你把logback-test.xml放在src/test/java下,Maven不会将其识别为资源文件,导致Logback无法读取配置生成日志。
操作:将logback-test.xml移至src/test/resources目录(无此目录则新建)。
3. 确保日志配置包含文件输出
检查logback-test.xml是否配置了输出到target目录的文件Appender,示例配置如下:
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>${project.build.directory}/karate-tests.log</file> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="FILE"/> <appender-ref ref="STDOUT"/> </root>
4. 排除冲突的依赖
错误日志显示存在多个冲突的SLF4J绑定包(不同版本的logback-classic、DigitalSigner.jar内的绑定),需在pom中排除这些冗余依赖。例如:
<dependency> <!-- 你的其他业务依赖 --> <exclusions> <exclusion> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency>
同时检查项目lib目录下的DigitalSigner.jar,若其内置SLF4J绑定,建议替换为无绑定的版本。
内容的提问来源于stack exchange,提问作者user13245465

