Spring Boot 如何从外部Maven依赖项禁用Log4j配置?

v440hwme  于 2022-12-04  发布在  Spring
关注(0)|答案(1)|浏览(278)

bounty将在6天后过期。回答此问题可获得+50声望奖励。Artegon希望吸引更多人关注此问题。

我将Sping Boot 应用程序与Log4j2 XML配置文件放在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>
h79rfbju

h79rfbju1#

听起来外部库使用Logback进行日志记录,但您的应用程序使用的是Log4j 2。在这种情况下,外部库可能会覆盖您的Log4j 2配置,因为它是由类加载器首先加载的。
防止外部库覆盖Log4j 2配置的一种方法是从外部库中排除Logback依赖项。这可以通过向外部库的Maven依赖项添加exclusions元素并指定ch.qos.logback groupId和logback-classic artifactId来实现。
例如:

<dependency>
  <groupId>com.example.externallibrary</groupId>
  <artifactId>externallibrary</artifactId>
  <version>1.0.0</version>
  <exclusions>
    <exclusion>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
    </exclusion>
  </exclusions>
</dependency>

这将从外部库中排除Logback依赖项,从而防止它覆盖您的Log4j 2配置。
或者,如果要继续使用外部库的日志配置,可以尝试对应用程序使用Logback而不是Log4j 2。可以通过在pom.xml文件中包含spring-boot-starter-logging依赖项并排除spring-boot-starter-log4j 2依赖项来实现此目的。这将配置应用程序使用Logback而不是Log4j 2。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-logging</artifactId>
  <version>${spring.boot.version}</version>
</dependency>

<!-- Exclude the Log4j2 dependency -->
<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-log4j2</artifactId>
    </exclusion>
  </exclusions>
</dependency>

这将允许您的应用程序使用外部库的Logback配置,而不会覆盖您自己的配置。但是,您需要更新代码以使用Logback的logger API,而不是Log4j 2的logger API。例如,您将使用ch. qos. logback. classic. Logger,而不是org.apache.logging.log4j.Logger。

// Import the Logback logger instead of the Log4j2 logger
import ch.qos.logback.classic.Logger;

// Use the Logback logger instead of the Log4j2 logger
private static final Logger LOGGER = LoggerFactory.getLogger(Foo.class);

我希望这对你有帮助!如果你有任何其他问题,请告诉我。

相关问题