我在resources/log4j2.xml
中放置了Log4j2 XML配置文件的Spring Boot应用程序。我使用的一个外部库是通过Maven依赖项安装的,并且在logback.xml
中有自己的日志配置。这个文件似乎覆盖了我的Log4J2配置,日志记录现在由这个配置文件控制。
我得到记录器实例(org.apache.logging.log4j.Logger
)这样:
private static final Logger LOGGER = LogManager.getLogger(Foo.class);
Q:如何从外部库禁用Log4J配置?
编辑1:添加与Log4j2相关的Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring.boot.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>${spring.boot.version}</version>
</dependency>
简写:
在您的情况下的问题是Spring尝试使用slf4j首先(这是logback-classic
的一部分)和Spring得到它,由于logback存在于您的类路径在运行时。从依赖中排除资源文件不是一件小事。
详细:
Spring-JCL under hood尝试通过在classloader中按顺序搜索类来初始化日志系统:
- 尝试加载Log4j(如果slf4j可用加载slf4j桥)
- 尝试加载Log4j
- 加载slf4j
- 加载java util日志
完整的逻辑在这里可用:github spring源代码
之后,Spring启动开始配置记录器(使用LoggingApplicationListener
)。在此阶段,Spring Boot使用配置文件和类路径中可用的日志记录器配置日志记录器。在您的情况下,其中一个依赖项使用logback-classic
作为依赖项,因此它在运行时可用于springboot,这就是为什么它使用logback-classic
。
有几种可能的方法来解决你的问题:
- 迁移到
logback-classic
并在您的项目中使用它(这是首选) - 如果很难将
log4j2
更改为logback-classic
,您可以同时支持它们(对于您的代码配置,log4j2.xml
将被使用,logback.xml
将用于spring)。有必要将logging.config
配置添加到application.properties
,并将路径添加到自定义logback.xml
- doc - 如果您想使用
log4j2
作为springboot本身的记录器,则有必要将logback-classic
从依赖项中排除(它可能导致使用它的依赖项出现问题)