我有一个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从我的测试资源目录中使用配置文件?
答案 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"
}