在 SpringBoot 中禁用 Logback

似乎 Springboot 自动配置为使用 Logback 和 Tomcat。我想禁用这个并使用我在类路径中提供的那个。

下面的错误消息。

LoggerFactory 不是 LogbackLoggerContext,但 Logback 位于 删除 Logback 或竞争实现 (org.slf4j.impl. SimpleLoggerFactory 类)类的对象 [ org.slf4j.impl. SimpleLoggerFactory ]必须是 class 的实例 经典的 LoggerContext

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>1.0.1.RELEASE</version>
</parent>


<groupId>com.fe</groupId>
<artifactId>cloudapp</artifactId>
<version>1.0.0</version>
<name>Withinet-PaaS</name>
<description>Develop your web applications in on our infrastructure and we will worry about administration and scalability of your app.</description>


<properties>
<java.version>1.7</java.version>
<guava.version>16.0.1</guava.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>


<dependencies>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.8</version>
</dependency>
<dependency>
<groupId>com.withinet.cloudapp</groupId>
<artifactId>slave</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-core</artifactId>
<version>6.15.0</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.0.Final</version>
</dependency>


<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.4</version>
</dependency>


<!-- Spring Boot -->


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>


<!-- Hibernate validator -->


<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>




</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>4.1.0.Final</version>
</dependency>


<!-- Guava -->


<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>


<!-- Java EE -->


<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>


<!--  Search -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>4.8.0</version>
</dependency>


<!--  Security
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>


<build>


<plugins>


<!-- Spring Boot Maven -->


<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.withinet.cloud.Application</mainClass>
<layout>JAR</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>


</plugins>
</build>
</project>
229556 次浏览

如果您确切地说明您的首选日志记录器是什么,以及您尝试并安装它时所做的工作,可能会有所帮助。无论如何,SpringBoot 尝试处理类路径中的任何内容,所以如果您不想要 logback,请将其从类路径中删除。虽然有 log4j在文件里的说明,但是同样的事情也适用于其他支持的日志系统(任何 slf4j、 log4j 或 javautil)。

将排除添加到 spring-boot-starter 和 spring-boot-starter-web 以解决冲突。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<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-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

在梯级中添加溶液。

dependencies {
compile ('org.springframework.boot:spring-boot-starter') {
exclude module : 'spring-boot-starter-logging'
}
compile ('org.springframework.boot:spring-boot-starter-web') {
exclude module : 'spring-boot-starter-logging'
}
}

为了在 Gradle 增加一个更好、更通用的解决方案(所有实例将被排除在外) :

configurations {
all*.exclude module : 'spring-boot-starter-logging'
}

来自 https://docs.gradle.org/current/userguide/dependency_management.html

我发现排除完整的 spring-boot-starter-logging模块是没有必要的。所需的全部操作就是排除 org.slf4j:slf4j-log4j12模块。

将这个文件添加到 Gradle 构建文件中可以解决这个问题:

configurations {
runtime.exclude group: "org.slf4j", module: "slf4j-log4j12"
compile.exclude group: "org.slf4j", module: "slf4j-log4j12"
}

有关详细信息,请参阅另一个 StackOverflow 回答

把这个添加到你的构建中

configurations.all {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
exclude group: 'org.springframework.boot', module: 'logback-classic'
}

我喜欢这样解决我的问题

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>

只需在您的类路径中添加 logback.xml 配置,并添加所有的配置,并添加 root appender。一旦 Spring 引导完成 bean 加载,它将根据您的配置开始日志记录。

我通过以下方式解决了我的问题:

compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.0'){
exclude module: 'log4j-slf4j-impl'
exclude module: 'logback-classic'
}
compile('org.springframework.boot:spring-boot-starter-web'){
exclude module: 'log4j-slf4j-impl'
exclude module: 'logback-classic'
}

为了升级,

您可以在 http://www.idanfridman.com/how-to-exclude-libraries-from-dependcies-using-gradle/看到这个解决方案

只需要在 configurations中添加 exclude:

configurations {
providedRuntime
compile.exclude(group: 'ch.qos.logback')
}

在 pom.xml 中找到 spring-boot-starter-test,并按如下方式修改它:

    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<exclusions>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
</exclusions>
<scope>test</scope>
</dependency>

它修正了以下错误:

_Caused by: java.lang.IllegalArgumentException:_ **LoggerFactory** is not a **Logback LoggerContext** but *Logback* is on the classpath.


Either remove **Logback** or the competing implementation


(_class org.apache.logging.slf4j.Log4jLoggerFactory_
loaded from file:


**${M2_HOME}/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.6.2/log4j-slf4j-impl-2.6.2.jar**).


If you are using WebLogic you will need to add **'org.slf4j'** to prefer-application-packages in WEB-INF/weblogic.xml: **org.apache.logging.slf4j.Log4jLoggerFactory**

下面的对我有用

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

这招对我很管用

configurations {
all*.exclude module : 'spring-boot-starter-logging'
}

但是对于 Maven用户来说就不行了。我所有的依赖项都在 libs.gradle 中,我不希望它们出现在其他文件中。所以这个 问题解决了通过在 spring-boot-starter-data-jpaspring-boot-starter-test和几乎所有的引导词中加入 exclude module : 'spring-boot-starter-logging

更新

我的新项目需要一个更新,原来 spring-boot-starter-test1.5以上没有 spring-boot-starter-logging.2

如果在 SpringBoot 中试图使用 log4j2时发生此错误,则 采取以下步骤:

  • 通过添加“ excludeGroupIds log4j-slf4j-impl/excludeGroupIds”来删除打包过程中的 jar
  • 使用命令“ mvn Depecy: tree”查找依赖于“ logback-Classic”的库
  • 无论你在哪里找到它,都将其排除在依赖关系之外。

发生此错误是因为 logback 覆盖了 log4j2的更改。因此,如果您想使用 log4j2,那么您必须删除 logback 库和依赖项。

希望这能帮到别人。

排除默认日志记录的正确方法,并为日志记录配置 log4j。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

请参阅 春季日志-如何

在 gradle 中,我需要对其他几个依赖项进行处理:

configurations {
all*.exclude module : 'spring-boot-starter-logging'
all*.exclude module : 'logback-classic'
}

添加从 Netbeans IDE 进行日志回退的排除

  1. 访问项目的 > 项目探索者部分
  2. 按照下面显示的操作进入 > 依赖性
  3. 跟踪“ spring-boot-starter-log-X.X.X.jar”
  4. 右键单击 jar 并选择 排除依赖性,如下所示。这样就排除了 pom.xml 上的 logback jar;

      <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
    <exclusion>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
    </exclusion>
    </exclusions>
    </dependency>
    

enter image description here

在我的情况下排除工程! !

    <dependency>
<groupId>com.xyz.util</groupId>
<artifactId>xyz-web-util</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>

对我来说,增加排除条款是不够的,我必须提供一个假罐子:

    <dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<scope>system</scope>
<systemPath>${project.basedir}/empty.jar</systemPath>
</dependency>

原因是,Spring 启动将 logback 作为默认的日志配置,而驼峰使用 log4j。这就是冲突的原因。您有两个选项,要么像上面的答案中提到的那样从 Spring 启动中删除 logback,要么从驼峰中删除 log4j。

<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring-boot-starter</artifactId>
<version>${camel.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>

在我的例子中,只需要从 spring-boot-starter-security中排除 spring-boot-starter-logging工件。

这是在一个新生成的 Spring boot 2.2.6. RELEASE 项目中,包括以下依赖项:

  • 弹簧-启动器-启动器-安全性
  • 弹簧-启动器-启动器-验证
  • 弹簧启动网
  • 弹簧启动器试验

我通过运行 mvn dependency:tree和寻找 ch.qos.logback发现的。

我的 pom.xml中与弹簧靴相关的 <dependencies>看起来是这样的:

    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<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>
</dependency>


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>


<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>


<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>






</dependencies>

我也一样。

enter image description here

如果您使用的是 log4j2

在 Spring 引导 2.4.0

下面是 决心,

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<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>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId> <-- exclude this artifactId
</exclusion>
</exclusions>
</dependency>

之后,Maven Build > Clean > Run

enter image description here

为我工作。

使用 格拉德尔龙目岛,这里是最简单的 Log4j2配置,我使用最新的 Spring Boot (目前是2.4.1) :

Gradle (部分)

configurations {
compileOnly { extendsFrom annotationProcessor }
compile.exclude module: 'spring-boot-starter-logging'
}




dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web-services'
implementation 'org.springframework.boot:spring-boot-starter-log4j2'


compileOnly 'org.projectlombok:lombok'


// (*** other dependencies ***)


annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
}

我注意到,如果将 spring-bbot-starter-log4j2作为 compileOnly依赖项而不是 implementation包含在内,将会出现错误。

只需用 @Log4j2(或 @Slf4j)注释您的类,Lombok 就会提供一个可用于日志记录的 log变量。

像往常一样,在 /src/main/resources文件夹中提供一个 log4j2.xml配置文件。

禁用弹簧启动器日志记录

    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

从 SpringBootStarter 中禁用 LogBack 或 Log4j

    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
</exclusion>
    

<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
</exclusions>
</dependency>