我有一个带有 Log4j2 XML 配置文件的 Spring Boot 应用程序,该文件位于 resources/log4j2.xml
中。我使用的一个外部库是通过 Maven 依赖项安装的,并且在 logback.xml
中有自己的日志记录配置。看起来这个文件覆盖了我的 Log4J2 配置,日志记录现在由这个配置文件控制。
我正在通过这种方式获取记录器实例 (org.apache.logging.log4j.Logger
):
private static final Logger LOGGER = LogManager.getLogger(Foo.class);
问:如何禁用外部库的 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 尝试通过按下一个顺序在类加载器中搜索类来初始化日志记录系统:
- 尝试加载 Log4j(如果 slf4j 可用加载 slf4j 桥)
- 尝试加载 Log4j
- 尝试加载slf4j
- 加载 java util 日志记录
此处提供完整逻辑:github spring source code
之后 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
(它会导致依赖问题,哪些人使用它)
关于java - 如何从外部 Maven 依赖项禁用 Log4j 配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74624355/