gpt4 book ai didi

java - 如何从外部 Maven 依赖项禁用 Log4j 配置?

转载 作者:行者123 更新时间:2023-12-05 05:30:34 25 4
gpt4 key购买 nike

我有一个带有 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 尝试通过按下一个顺序在类加载器中搜索类来初始化日志记录系统:

  1. 尝试加载 Log4j(如果 slf4j 可用加载 slf4j 桥)
  2. 尝试加载 Log4j
  3. 尝试加载slf4j
  4. 加载 java util 日志记录

此处提供完整逻辑:github spring source code

之后 Spring 启动开始配置记录器(使用 LoggingApplicationListener)。在此阶段,Spring Boot 使用配置文件和类路径中的可用记录器配置记录器。在您的情况下,其中一个依赖项使用 logback-classic 作为依赖项,因此它在运行时可用于 springboot,这就是它使用 logback-classic 的原因。

有几种可能的方法可以解决您的问题:

  1. 迁移到 logback-classic 并在您的项目中使用它(最好)
  2. 如果很难将 log4j2 更改为 logback-classic,您可以同时支持它们(对于来自 log4j2.xml 的代码配置> 将被使用,logback.xml 将被用于 spring)。有必要将 logging.config 配置添加到 application.properties,并使用自定义 logback.xml 的路径 - doc
  3. 如果你想使用 log4j2 作为 springboot 本身的记录器,有必要从你的依赖中排除 logback-classic(它会导致依赖问题,哪些人使用它)

关于java - 如何从外部 Maven 依赖项禁用 Log4j 配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74624355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com