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

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

HankCa
fonte
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'
    }
}
Amer A.
fonte
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.

Andrew
fonte
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>
JiaweiQin
fonte
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**
me pergunte
fonte
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>
Harsimranjit Singh Kler
fonte
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).

Dave Syer
fonte
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'
}
Leo
fonte
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

Dennis Glot
fonte
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>
Pierre C
fonte
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'
}
Quy Tang
fonte
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.

Atul
fonte
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 .

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

Dun0523
fonte
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>
Ashish Sharma
fonte
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>
Alex R
fonte
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>
Abhishek Chatterjee
fonte
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.

Sakthivel thangasamy
fonte