从测试目录运行JMH基准测试时log42.xml未被加载的问题
解决JMH基准测试中log4j2配置未加载及屏蔽日志的问题
首先纠正个小笔误:你提到的log42.xml应该是log4j2.xml吧?下面针对这个问题给出几个可行的解决方案:
1. 确保配置文件在正确的位置
log4j2默认会从类路径下加载配置文件,所以你需要把log4j2.xml放在src/test/resources目录下(和测试代码的资源目录对应)。这样Gradle的sourceSets.test.runtimeClasspath会自动包含这个目录,配置文件就能被正常加载到。
如果你的配置文件不在这个默认位置,那需要在Gradle任务里手动指定路径。
2. 在Gradle Benchmark任务中指定log4j2配置
修改你的Gradle任务,添加系统属性来指定log4j2的配置文件路径,确保JVM启动时能精准找到它:
task benchmark(type: JavaExec) { dependsOn compileTestJava classpath = sourceSets.test.runtimeClasspath main = "com.example.Benchmark" // 手动指定log4j2配置文件的绝对路径 systemProperty "log4j.configurationFile", file("src/test/resources/log4j2.xml").absolutePath }
3. 编写log4j2配置文件实现日志屏蔽
为了完全屏蔽控制台干扰日志,你可以写一个极简的log4j2.xml配置,把根日志级别设为OFF(彻底关闭所有日志)或者ERROR(仅保留错误级别的关键日志):
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="OFF"> <!-- 关闭log4j2自身的日志输出 --> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="OFF"> <!-- 关闭所有业务日志输出 --> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
4. 验证依赖是否正确引入
确保你的build.gradle中已经引入了log4j2的核心依赖,否则配置文件也无法生效:
dependencies { // log4j2核心依赖 testImplementation "org.apache.logging.log4j:log4j-api:2.20.0" testImplementation "org.apache.logging.log4j:log4j-core:2.20.0" // JMH相关依赖(如果还没添加的话) testImplementation "org.openjdk.jmh:jmh-core:1.37" testImplementation "org.openjdk.jmh:jmh-generator-annprocess:1.37" }
快速替代方案:无需配置文件直接屏蔽
如果你不想写配置文件,也可以直接通过系统参数强制关闭日志,在Gradle任务里添加:
task benchmark(type: JavaExec) { dependsOn compileTestJava classpath = sourceSets.test.runtimeClasspath main = "com.example.Benchmark" // 直接通过系统参数设置全局日志级别为OFF systemProperty "org.apache.logging.log4j.level", "OFF" }
这样配置后,运行./gradlew benchmark时,控制台就不会输出多余的干扰日志,只会保留JMH本身的基准测试结果啦。
内容的提问来源于stack exchange,提问作者deamon
相关产品推荐
相关产品推荐

