从测试目录运行JMH基准测试时,不会拾取log42.xml

时间:2018-05-04 14:04:52

标签: java gradle log4j2

我有一个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.xml下创建了src\test\resources配置文件。

在我的log42.xml中,我注释掉了对控制台appender的每个引用,我甚至注释掉了appender本身。但我仍然在控制台上收到日志消息,这意味着我的Log4j配置不起作用,而是使用默认配置。这是fallback of 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从我的测试资源目录中使用配置文件?

1 个答案:

答案 0 :(得分:0)

此问题是不正确的依赖关系管理的副作用。该基准测试是Spring Boot应用程序的一部分,Spring Boot默认带有Logback日志记录。如果您想使用Log4J,则必须明确exclude Logback。我这样做了,但是忘记了新的依赖,所以Logback回来了。

修复方法是使用此Gradle配置一次性排除Logback(通过spring-boot-starter-logging):

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