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

标签 java spring-boot maven log4j2

我有一个带有 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/

相关文章:

java - 如何让用户在二维数组中输入 5 个标记?

java - 如何遍历所有 cookie 并删除它们 Java

java - 使用 wsimport JAX-WS 中创建的 Web 服务

spring - 为什么 Spring Boot 在 Mac OSX Mavericks (10.9.2) 上启动非常慢?

java - 添加 spring-cloud-starter-dataflow-server-local 会导致错误 : Command line is too long. Shorten command line for ... 或 Spring Boot

spring - 制作前端和后端(Angular 2 和 Spring)Maven 多模块项目

java.io.StreamTokenizer.TT_NUMBER : Floating or Integer?

nginx - Spring Boot 和 Nginx 集成

java - 如何在Maven中的资源中添加子文件夹

postgresql - 使用 Maven Mojo sql :execute 时出错