在SpringBoot中禁用Logback


118

看来Springboot会自动配置为将Logback与Tomcat一起使用。我想禁用此功能,并使用我在类路径中提供的功能。

下面的错误信息。

LoggerFactory不是Logback LoggerContext,但Logback在类路径上。删除Logback或竞争实现(类org.slf4j.impl.SimpleLoggerFactory)[org.slf4j.impl.SimpleLoggerFactory]类的对象必须是ch.qos.logback.classic.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>

Answers:


143

将排除项添加到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>

3
这对我不起作用,因为如果我添加这些排除项,则会得到:java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
Ariel 2014年

2
完成此操作后,您将必须在类路径中提供自己的记录器,例如log4j。为什么要从应用程序中排除默认记录器?
FOO 2014年

1
有没有一种方法可以找出哪个jar声明了logback而无需在每个jar中进行一些“探索”呢?而且,谢谢!这对我
有所

4
mvn依赖项:tree -Dverbose -Dincludes = spring-boot-starter-logging
FOO

必须将此排除项添加到每个spring-boot-starter- *依赖项中是一个巨大的麻烦。似乎Gradle至少允许全局排除。仅此一点就使我考虑从Maven切换。
scottysseus

59

为了在Gradle中添加更好,更通用的解决方案(所有实例将被排除):

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

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


1
这对我和至少7个人有用。我认为您的配置或环境问题不应该成为我的解决方案的选票(我认为收到的选票来自您的评论-如果我错了,表示歉意)。
HankCa

1
已经尝试了所有其他配置,这是唯一对我
有用的

这行不通,我仍然看到spring-boot-starter-logging
Adam Arold

40

在gradle中添加解决方案。

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'
    }
}

14

我发现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 答案


11

我喜欢这样解决我的问题

<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>


9

在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**

7

关注我的作品

<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>

与此相关的是,我仍然在最终工件中看到了回传JAR(正在使用Assembly插件而不是Boot的Maven插件-因此不确定它是否确实适用于Boot打包)
Janaka Bandara

7

如果您说出您首选的记录器是什么,以及尝试安装它的操作,可能会有所帮助。无论如何,Spring Boot会尝试使用类路径中的任何内容,因此,如果您不想注销,请将其从类路径中删除。在文档中有关于log4j的说明,但是同样的情况也适用于其他受支持的日志记录系统(任何slf4j,log4j或java util)。


3
我使用slf4j,但在maven pom文件中看不到logback。
FOO 2014年

Logback slf4j记录器。也许您可以分享pom?
Dave Syer

我看不到任何其他slf4j实现,因此它必须是可传递的。您可以使用m2e(Eclipse)或“ mvndependency:tree”之类的工具来可视化依赖关系。Eclipse工具还具有用于排除依赖项的GUI(这是您需要做的-排除其中之一)。如果您已经具有完整的slf4j(包括jcl桥),则可以排除“ spring-boot-starter-logging”。
Dave Syer 2014年

5

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

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'
}

5

这对我来说很好

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

但是对于行家来说,这是行不通的。我所有的依赖项都在libs.gradle中,我不希望它们在其他文件中。所以,这个问题解决了通过增加exclude module : 'spring-boot-starter-loggingspring-boot-starter-data-jpaspring-boot-starter-test而且在几乎一切与引导词。

更新

我的新项目需要更新,结果是spring-boot-starter-test1.5和更早的版本没有spring-boot-starter-logging。2.0有它


5

就我而言,只需spring-boot-starter-logging要从工件中排除工件即可spring-boot-starter-security

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

  • spring-boot-starter-security
  • spring-boot-starter-validation
  • 弹簧启动启动器网站
  • 春季启动启动器测试

我通过跑步mvn dependency:tree和寻找 找到了ch.qos.logback

<dependencies>在我pom.xml看来,相关的弹簧靴是这样的:

    <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>

在排除spring-boot-starter-logging之后,它起作用了
Prateek Mehta,

4

将此添加到您的build.gradle

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'
}

2

如果您尝试使用log4j2时在SpringBoot中发生此错误,请执行以下步骤:

  • 通过添加此“ excludeGroupIds log4j-slf4j-impl / excludeGroupIds”,在打包时从罐中删除
  • 使用命令“ mvnDependecy:tree”找出哪个库依赖于“ logback-classic”
  • 无论在哪里找到它,都将其从依赖项中排除。

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

希望这会帮助某人。


2

排除默认日志记录的正确方法,并配置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>

请参阅Spring Logging-How to


1

从Netbeans IDE添加用于登录的排除项

  1. 访问您的项目的> 项目资源管理器部分
  2. 进入> 依赖关系,如下所示
  3. 跟踪'spring-boot-starter-logging-XXXjar'
  4. 右键单击罐子,然后选择“ 排除依赖关系”,如下所示。这样就排除了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>
    

在此处输入图片说明


1

在我的情况下,以下排除方法有效!!

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

1

添加排除项对我来说还不够。我必须提供一个假罐子:

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

1

原因是,spring boot附带logback作为其默认日志配置,而camel使用log4j。多数民众赞成在冲突的原因。您有两个选择,或者按照上述答案中的说明从spring boot中删除logback或从camel中删除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>

0

只需在类路径中添加logback.xml配置,并添加添加了根附加程序的所有配置即可。一旦Spring Boot完成了Bean的加载,它将根据您的配置开始记录日志。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.