Spring boot log4j2 Slf4j LoggerFactory.getILoggerFactory获取的记录器只能读取默认的log4j.xml而不读取配置文件

Spring boot log4j2 Slf4j LoggerFactory.getILoggerFactory获取的记录器只能读取默认的log4j.xml而不读取配置文件,spring-boot,log4j2,slf4j,Spring Boot,Log4j2,Slf4j,在带有测试概要文件的SpringBoot项目中使用log4j2 org.slf4j.LoggerFactory.getLogger(“xxx”)可以从log4j2 test.xml获取测试配置文件LoggerContext并读取配置 LoggerFactory.getLogger("xxx"); // log4j2-test.xml LoggerFactory.getILoggerFactory().getLogger("xxx"); // log4j2.

在带有测试概要文件的SpringBoot项目中使用log4j2

org.slf4j.LoggerFactory.getLogger(“xxx”)
可以从
log4j2 test.xml
获取测试配置文件LoggerContext并读取配置

LoggerFactory.getLogger("xxx"); // log4j2-test.xml
LoggerFactory.getILoggerFactory().getLogger("xxx"); // log4j2.xml
但是

org.slf4j.LoggerFactory.getILoggerFactory().getLogger(“xxx”)
只能从
log4j2.xml
获取当前LoggerContext并读取配置

LoggerFactory.getLogger("xxx"); // log4j2-test.xml
LoggerFactory.getILoggerFactory().getLogger("xxx"); // log4j2.xml
它是log4j2的bug吗

我测试了LoggerFactory.getILoggerFactory().getLogger(“xxx”)使用Logback,Logback可以正确选择
log4j2 test.xml

SpringBoot版本:
2.4.5


添加一些背景知识以帮助更多人:
ParSeq
framework通过
LoggerFactory.getILoggerFactory().getLogger(“xxx”)
不,这不会是Log4j中的错误。Log4j对Spring配置文件一无所知,也没有将它们纳入其定位配置文件的逻辑中

您正在调用的LoggerFactory中的方法是静态的。这意味着它们是由SLF4J实现的。显示getLogger(“XXX”)的功能

这与您在第二次呼叫中手动执行的操作完全相同,因此我看不出它们之间有什么区别


我还怀疑Logback能否正确选择log4j2-test.xml,因为这对于Logback来说是一个无效的配置文件。

这应该是log4j2的一个bug:

神奇之处在于log4j-slf4j-impl的Log4jLoggerFactory.java。尽管这两个方法最终调用相同的方法,但它们的调用堆栈是不同的
Log4jLoggerFactory.getContext()
将按方法调用堆栈选择上下文。但它只支持LoggerFactory.getLogger(“xxx”)