【问题标题】:Disable Logback in SpringBoot在 Spring Boot 中禁用 Logback
【发布时间】:2014-07-21 22:47:34
【问题描述】:

Springboot 似乎会自动配置自己以将 Logback 与 Tomcat 一起使用。我想禁用它并使用我在类路径中提供的那个。

下面的错误信息。

LoggerFactory 不是 Logback LoggerContext 但 Logback 在 类路径。删除 Logback 或竞争实现 (class 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>

【问题讨论】:

    标签: spring-boot


    【解决方案1】:

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

    【讨论】:

    • 它对我不起作用,因为如果我添加这些排除项,我会得到:java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
    • 一旦你这样做了,你必须在你的类路径中提供你自己的记录器,例如 log4j。为什么要从应用程序中排除默认记录器?
    • 有没有办法找出哪个 jar 声明了 logback 而无需在每个 jar 中进行一些“探索”?而且,谢谢!这对我有帮助
    • mvn 依赖:tree -Dverbose -Dincludes=spring-boot-starter-logging
    • 必须将此排除添加到每个 spring-boot-starter-* 依赖项中是一个巨大的麻烦。似乎 Gradle 至少允许全局排除。仅此一项就让我认真考虑从 Maven 切换。
    【解决方案2】:

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

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

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

    【讨论】:

    • 这对我和至少 7 个人都有效。我认为您的配置或环境问题不应该是我的解决方案的反对票(我认为我收到的反对票来自您的评论 - 如果我错了,请道歉)。
    • 这个不行,我还是看到spring-boot-starter-logging
    • 这对我有用。现在 gradle 能够在没有与日志相关的错误的情况下运行测试。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我发现没有必要排除完整的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 answer 了解更多详情。

      【讨论】:

        【解决方案5】:

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

        在 gradle 中,我需要使用其他几个依赖项来做到这一点:

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

        【讨论】:

        • 这应该被认为是正确的答案,来到这里的开发者应该认真思考要遵循哪些答案。这个答案引用了当前的spring boot docs,而他的许多其他答案都是某种形式的“这对我有用”。我会说,如果按照 Spring Boot 文档所说的那样去做并且它不起作用,请仔细查看您的 maven 依赖项并找出问题所在。
        • 是的,因为如果你不特别从“spring-boot-starter”中排除“spring-boot-starter-logging”,它可能仍然会找到一种方法从其他一些进入你的罐子弹簧启动器
        【解决方案6】:

        对于毕业,

        您可以在以下位置查看此解决方案:http://www.idanfridman.com/how-to-exclude-libraries-from-dependcies-using-gradle/

        只需要在configurations中添加exclude

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

        【讨论】:

          【解决方案7】:

          我这样做是为了解决我的问题

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

              如果您确切地说出您首选的记录器是什么,以及您为尝试安装它所做的工作,这可能会有所帮助。无论如何,Spring Boot 尝试使用类路径中的任何内容,因此如果您不想要 logback,请将其从类路径中删除。有 log4j in the docs 的说明,但同样的事情也适用于其他支持的日志系统(任何 slf4j、log4j 或 java util)。

              【讨论】:

              • 我使用 slf4j,但在我的 maven pom 文件中看不到 logback。
              • Logback 一个 slf4j 记录器。也许你可以分享你的 pom?
              • 我看不到任何其他的 slf4j 实现,所以它必须是传递进来的。您可以使用 m2e (Eclipse) 或“mvn dependency:tree”等工具来可视化依赖关系。 Eclipse 工具还有一个用于排除依赖项的 GUI(这是您需要做的 - 排除其中一个)。如果您已经拥有完整的 slf4j(包括 jcl 桥),则排除“spring-boot-starter-logging”可能就足够了。
              【解决方案10】:

              以下作品适合我

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

              【讨论】:

              • 有了这个,我仍然在最终工件中看到 logback JAR(使用的是 Assembly 插件而不是 Boot 的 Maven 插件 - 所以不确定它是否真的适用于 Boot 打包)
              【解决方案11】:

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

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

              【讨论】:

                【解决方案12】:

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

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

                • spring-boot-starter-security
                • spring-boot-starter-validation
                • spring-boot-starter-web
                • spring-boot-starter-test

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

                我的pom.xml中的spring boot相关&lt;dependencies&gt;是这样的:

                    <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 后有效
                【解决方案13】:

                对我来说同样的问题。

                如果您使用的是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 构建 > 清理 > 运行

                为我工作。

                【讨论】:

                  【解决方案14】:

                  这对我来说很好用

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

                  但它不适用于 ma​​ven 用户。我所有的依赖项都在 libs.gradle 中,我不希望它们在其他文件中。所以这个问题解决了,通过在spring-boot-starter-data-jpaspring-boot-starter-test 以及几乎所有带有引导字的内容中添加exclude module : 'spring-boot-starter-logging

                  更新

                  我的新项目需要更新,结果spring-boot-starter-test 1.5 和更早版本没有spring-boot-starter-logging。 2.0就有了

                  【讨论】:

                    【解决方案15】:

                    在你的 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'
                    }
                    

                    【讨论】:

                      【解决方案16】:

                      如果在 SpringBoot 中尝试使用 log4j2 时出现此错误,那么 执行以下步骤:

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

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

                      希望这会对某人有所帮助。

                      【讨论】:

                        【解决方案17】:

                        使用 GradleLombok,这是 Log4j2 的最简单配置,它使用最新的 Spring Boot(2.4.1 at这次):

                        build.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 配置文件。

                        【讨论】:

                          【解决方案18】:

                          从 Netbeans IDE 为 logback 添加排除项

                          1. 访问您的项目的 >Projects explorer 部分
                          2. 继续 >依赖项,如下所示
                          3. 跟踪“spring-boot-starter-logging-X.X.X.jar”
                          4. 右键单击 jar 并选择 Exclude Dependency,如下所示。这不包括 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>
                            

                          【讨论】:

                            【解决方案19】:

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

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

                            【讨论】:

                              【解决方案20】:

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

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

                              【讨论】:

                                【解决方案21】:

                                原因是,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>
                                

                                【讨论】:

                                  【解决方案22】:

                                  只需在类路径中添加 logback.xml 配置,然后添加所有配置并添加根附加程序。一旦 Spring boot 完成 bean 加载,它将根据您的配置开始记录。

                                  【讨论】:

                                    【解决方案23】:

                                    禁用 Spring Boot Starter 日志记录

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

                                    从 Spring Boot Starter 禁用 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>
                                    

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 2017-01-21
                                      • 2023-04-04
                                      • 2019-01-19
                                      • 1970-01-01
                                      • 2020-07-18
                                      • 2016-04-25
                                      • 2019-07-27
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多