首页 > 解决方案 > 从测试目录运行 JMH 基准测试时未拾取 log42.xml

问题描述

我有一个 Gradle 任务来运行 JMH 基准测试:

task benchmark(type: JavaExec) {
    dependsOn compileTestJava
    classpath = sourceSets.test.runtimeClasspath
    main = "com.example.Benchmark"
}

Benchmark只是 JMH 的入口点,位于src\test\java\com\example(用 Kotlin 编写,但这在这里无关紧要):

object Benchmark {

    @JvmStatic
    fun main(args: Array<String>) {        
        org.openjdk.jmh.Main.main(args)
    }
}

为了不扭曲我的基准,我想禁止记录到控制台。因此,我log4j2.xmlsrc\test\resources.

在我的文章log42.xml中,我注释掉了对控制台附加程序的所有引用,我什至注释掉了附加程序本身。但是我仍然在控制台上收到日志消息,这意味着我的 Log4j 配置无效,而是使用了默认配置。这是Log4j 的后备

如果我将以下块添加到上述main方法中,一切似乎都是正确的:

val log4Url = javaClass.classLoader.getResource("log4j2.xml")
val log4JConfigPath = Paths.get(log4Url.toURI())
println("classpath: " + log4JConfigPath.toAbsolutePath())

log4j2.xml存在于我期望的位置()build\resources\test\log4j2.xml。行为与文件名相同log4j2-test-xml)。来自的配置文件src\main\resources也被忽略。

如果这有任何相关性,我正在使用 Gradle 4.7。

我必须做什么才能让 Log4j 使用我的测试资源目录中的配置文件?

标签: javagradlelog4j2

解决方案


这个问题是不正确的依赖管理的副作用。基准测试是 Spring Boot 应用程序的一部分,Spring Boot 默认带有 Logback 日志记录。如果您想改用 Log4J,则必须明确排除 Logback。我这样做了,但是因为有了新的依赖而忘记了它,所以 Logback 又回来了。

spring-boot-starter-logging解决方法是使用此 Gradle 配置一劳永逸地排除 Logback(通过):

configurations.all {
    exclude group: "org.springframework.boot", module: "spring-boot-starter-logging"
} 

推荐阅读