Desativar Logback no SpringBoot


118

Parece que o Springboot se autoconfigura para usar o Logback com o Tomcat. Eu gostaria de desabilitar isso e usar aquele que forneço no meu caminho de classe.

A mensagem de erro abaixo.

LoggerFactory não é um Logback LoggerContext, mas Logback está no caminho de classe. Remova o Logback ou a implementação concorrente (classe org.slf4j.impl.SimpleLoggerFactory) O objeto da classe [org.slf4j.impl.SimpleLoggerFactory] deve ser uma instância da classe 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>

Respostas:


143

Adicione exclusão ao spring-boot-starter e ao spring-boot-starter-web para resolver o conflito.

<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
Ele não funciona para mim, porque se eu adicionar essas exclusões eu recebo: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory.
Ariel de

2
Depois de fazer isso, você terá que fornecer seu próprio logger, por exemplo, log4j em seu classpath. Por que você deseja excluir os registradores padrão de seu aplicativo?
FOO de

1
Existe uma maneira de descobrir qual jar declara logback sem fazer alguma 'exploração' em cada jar? E obrigado! Isso me ajudou
vivek_ganesan

4
mvn dependency: tree -Dverbose -Dincludes = spring-boot-starter-logging
FOO

ter que adicionar essa exclusão a cada dependência spring-boot-starter- * é um grande aborrecimento. Parece que o Gradle pelo menos permite uma exclusão global. Só isso já está me fazendo pensar em mudar de Maven.
scottysseus

59

Para adicionar uma solução melhor e mais genérica no Gradle (todas as instâncias serão excluídas):

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

De https://docs.gradle.org/current/userguide/dependency_management.html


1
Isso funciona para mim e pelo menos 7 outras pessoas. Não acho que um problema com sua configuração ou ambiente deva ser um downvote para minha solução (presumi que o downvote que recebi era do seu comentário - desculpe se estiver errado).
HankCa

1
Tentei todas as outras configurações, esta é a única que funcionou para mim
timothyclifford

Ainda vejo que não funcionaspring-boot-starter-logging
Adam Arold

40

Para adicionar uma solução no 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

Descobri que spring-boot-starter-loggingnão é necessário excluir o módulo completo . Tudo o que é necessário é excluir o org.slf4j:slf4j-log4j12módulo.

Adicionar isso a um arquivo de compilação do Gradle resolverá o problema:

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

Veja esta outra resposta StackOverflow para mais detalhes.


11

Eu gosto disso para resolver meu problema

<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

Encontre spring-boot-starter-test em seu pom.xml e modifique-o da seguinte maneira:

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

Ele corrigiu erros como:

_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

Seguir funciona para mim

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

Com isso, eu ainda estava vendo os JARs de logback no artefato final (estava usando o plugin Assembly em vez do plugin Maven do Boot - então não tenho certeza se ele realmente funciona com o pacote do Boot)
Janaka Bandara

7

Pode ajudar se você disser qual é exatamente o seu logger preferido e o que você fez para tentar instalá-lo. De qualquer forma, o Spring Boot tenta trabalhar com o que quer que esteja no caminho de classe, então se você não quiser logback, retire-o do caminho de classe. Existem instruções para log4j nos documentos , mas a mesma coisa se aplica a outros sistemas de registro suportados (qualquer coisa slf4j, log4j ou java util).


3
Eu uso o slf4j e não consigo ver o logback no meu arquivo maven pom.
FOO

Logback é um logger slf4j. Talvez você possa compartilhar seu pom?
Dave Syer

Não consigo ver nenhuma outra implementação do slf4j explicitamente, então deve estar ocorrendo transitivamente. Você pode usar ferramentas como m2e (Eclipse) ou "mvn dependency: tree" para visualizar as dependências. O conjunto de ferramentas do Eclipse também tem uma GUI para excluir dependências (isso é o que você precisa fazer - excluir uma delas). Pode ser suficiente excluir "spring-boot-starter-logging" se você já tiver um slf4j completo (incluindo a ponte jcl).
Dave Syer

5

Resolvi meu problema através do seguinte:

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

Isso funcionou muito bem para mim

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

Mas não funcionaria para usuários maven . Todas as minhas dependências estavam em libs.gradle e eu não as queria em outros arquivos. Portanto, este problema foi resolvido pela adição exclude module : 'spring-boot-starter-loggingde spring-boot-starter-data-jpa, spring-boot-starter-teste em praticamente tudo com a palavra boot.

ATUALIZAR

Meu novo projeto precisava de uma atualização, mas spring-boot-starter-test1.5 e anteriores não precisavam spring-boot-starter-logging. 2.0 tem isso


5

No meu caso, foi necessário apenas excluir o spring-boot-starter-loggingartefato de spring-boot-starter-securityum.

Este é um projeto Spring boot 2.2.6.RELEASE recém-gerado, incluindo as seguintes dependências:

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

Eu descobri correndo mvn dependency:treee procurando ch.qos.logback.

A bota de mola relacionada <dependencies>na minha pom.xmlparece assim:

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

Funcionou depois de excluir o registro de inicialização de boot
Prateek Mehta

4

Adicione isso em seu 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

Se esse erro ocorreu no SpringBoot quando você estava tentando usar o log4j2, siga estas etapas:

  • Remova o jar enquanto empacota adicionando este "excludeGroupIds log4j-slf4j-impl / excludeGroupIds"
  • Descubra qual biblioteca depende de "logback-classic" usando o comando "mvn dependecy: tree"
  • Onde quer que você o encontre, exclua-o da dependência.

Este erro ocorreu porque o logback substituiu as alterações do log4j2. SO se você quiser usar o log4j2, você deve remover a biblioteca de logback e as dependências.

Espero que isso ajude alguém.


2

Maneira correta de excluir o log padrão e configurar o log4j para o log.

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

Consulte Spring Logging - Como .


1

Para adicionar uma exclusão para logback do Netbeans IDE

  1. Acesse a> seção Explorador de projetos do seu projeto
  2. Prossiga para> Dependências conforme exibido abaixo
  3. Rastrear 'spring-boot-starter-logging-XXXjar'
  4. Clique com o botão direito no jar e selecione Excluir Dependência como mostrado abaixo. Isso exclui o jar de logback no pom.xml como este;

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

insira a descrição da imagem aqui


1

No meu caso abaixo, a exclusão funciona !!

    <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

Adicionar exclusões não foi suficiente para mim. Tive que fornecer um frasco falso:

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

1

O motivo é que o spring boot vem com logback como configuração de log padrão, enquanto o camel usa o log4j. Essa é a razão do conflito. Você tem duas opções, remover o logback do Spring Boot conforme mencionado nas respostas acima ou remover o log4j do camel.

<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

Basta adicionar a configuração logback.xml em seu classpath e adicionar todas as suas configurações com o appender root adicionado. Assim que a inicialização do Spring completar o carregamento do bean, ele começará a registrar com base em sua configuração.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.