如何从外部Maven依赖中禁用Log4j配置?



我在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中按顺序搜索类来初始化日志系统:

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

完整的逻辑在这里可用:github spring源代码

之后,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从依赖项中排除(它可能导致使用它的依赖项出现问题)

最新更新