java - 从测试目录运行 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.xml
在src\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 使用我的测试资源目录中的配置文件?
解决方案
这个问题是不正确的依赖管理的副作用。基准测试是 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"
}
推荐阅读
- c# - 使用响应式扩展批量轮询数据库表
- cucumber - Cucumber 测试用例一起运行时失败,但单独运行时通过
- intellij-idea - 使用 Search Everywhere 从特定文件夹中按名称搜索文件:IntelliJ IDEA
- html - s 在桌面上进入全屏宽度,但在移动设备上没有,为什么?
- db2 - DB2 添加列、插入数据和新 id
- c# - 是否有内置的 IEqualityComparer
对于 System.Int32? - r - ggplot2根据时间序列R中的因子放置矩形或平铺
- javascript - 通过路由发送参数
- javascript - 更改选择列表中的选项时如何停止所有 YouTube 视频
- binary - 在 Prolog 中从十六进制转换为二进制