Disabilita Logback in SpringBoot


118

Sembra che Springboot si configuri automaticamente per utilizzare Logback con Tomcat. Vorrei disabilitarlo e utilizzare quello che fornisco nel mio classpath.

Il messaggio di errore di seguito.

LoggerFactory non è un Logback LoggerContext ma Logback si trova sul classpath. Rimuovere Logback o l'implementazione concorrente (classe org.slf4j.impl.SimpleLoggerFactory) L'oggetto della classe [org.slf4j.impl.SimpleLoggerFactory] deve essere un'istanza della 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>

Risposte:


143

Aggiungi l'esclusione sia a spring-boot-starter che a spring-boot-starter-web per risolvere il conflitto.

<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
Non funziona per me, perché se aggiungo quelle esclusioni ottengo: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory.
Ariel

2
Una volta fatto questo, dovrai fornire il tuo logger, ad esempio log4j nel tuo classpath. Perché desideri escludere i logger predefiniti dalla tua applicazione?
FOO

1
C'è un modo per scoprire quale jar dichiara logback senza fare un po 'di "esplorazione" in ogni jar? E grazie! Questo mi ha aiutato
vivek_ganesan

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

dover aggiungere questa esclusione a ciascuna dipendenza spring-boot-starter- * è una seccatura enorme. Sembra che Gradle permetta almeno un'esclusione globale. Questo da solo mi sta facendo seriamente considerare il passaggio da Maven.
scottysseus

59

Per aggiungere una soluzione migliore e più generica in Gradle (tutte le istanze verranno escluse):

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

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


1
Funziona per me e almeno altre 7 persone. Non penso che un problema con la tua configurazione o ambiente dovrebbe essere un voto negativo per la mia soluzione (ho pensato che il voto negativo che ho ricevuto fosse dal tuo commento - scusami se mi sbaglio).
HankCa

1
Ho provato tutte le altre configurazioni, questa è l'unica che ha funzionato per me
timothyclifford

Questo non funziona, vedo ancoraspring-boot-starter-logging
Adam Arold il

40

Aggiungere una soluzione in 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

Ho scoperto che spring-boot-starter-loggingnon è necessario escludere il modulo completo . Tutto ciò che serve è escludere il fileorg.slf4j:slf4j-log4j12 modulo.

L'aggiunta di questo a un file di build Gradle risolverà il problema:

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

Vedi questa altra risposta StackOverflow per maggiori dettagli.


11

Mi piace per risolvere il mio 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

Trova spring-boot-starter-test nel tuo pom.xml e modificalo come segue:

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

Ha risolto errori come:

_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

Seguire lavori per me

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

Con questo stavo ancora vedendo i JAR di logback nell'artefatto finale (stavo usando il plug-in Assembly invece del plug-in Maven di Boot, quindi non sono sicuro che funzioni effettivamente con Boot packaging)
Janaka Bandara

7

Potrebbe essere utile dire qual è esattamente il tuo logger preferito e cosa hai fatto per provare a installarlo. Comunque, Spring Boot cerca di lavorare con qualunque cosa si trovi nel classpath, quindi se non vuoi il logback, rimuovilo dal classpath. Ci sono istruzioni per log4j nei documenti , ma la stessa cosa si applicherebbe ad altri sistemi di registrazione supportati (qualsiasi cosa slf4j, log4j o java util).


3
Uso slf4j e non riesco a vedere il logback nel mio file pom di maven.
FOO

Logback è un logger slf4j. Forse puoi condividere il tuo pom?
Dave Syer

Non riesco a vedere esplicitamente altre implementazioni di slf4j, quindi deve arrivare in modo transitivo. Puoi usare strumenti come m2e (Eclipse) o "mvn dependency: tree" per visualizzare le dipendenze. Gli strumenti di Eclipse hanno anche una GUI per escludere le dipendenze (questo è quello che devi fare - escluderne una). Potrebbe essere sufficiente escludere "spring-boot-starter-logging" se hai già un slf4j completo (incluso il bridge jcl).
Dave Syer

5

Ho risolto il mio problema con questo di seguito:

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

Questo ha funzionato bene per me

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

Ma non avrebbe funzionato per Maven utenti. Tutte le mie dipendenze erano in libs.gradle e non le volevo in altri file. Quindi questo problema è stato risolto con l'aggiunta exclude module : 'spring-boot-starter-loggingdi spring-boot-starter-data-jpa, spring-boot-starter-teste in praticamente tutto con la parola di avvio.

AGGIORNARE

Il mio nuovo progetto necessitava di un aggiornamento, risulta che spring-boot-starter-test1.5 e precedenti non lo avevano spring-boot-starter-logging. 2.0 ce l'ha


5

Nel mio caso, era solo necessario escludere l' spring-boot-starter-loggingartefatto da spring-boot-starter-securityquello.

Questo è in un nuovo progetto Spring Boot 2.2.6.RELEASE che include le seguenti dipendenze:

  • primavera-boot-starter-sicurezza
  • primavera-boot-starter-convalida
  • primavera-boot-starter-web
  • primavera-boot-starter-test

L'ho scoperto correndo mvn dependency:treee cercando ch.qos.logback .

Lo stivale a molla correlato <dependencies>nel mio pom.xmlassomiglia a questo:

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

Ha funzionato dopo aver escluso la registrazione dell'avviamento primaverile
Prateek Mehta il

4

Aggiungi questo nel tuo 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 questo errore si è verificato in SpringBoot quando si tenta di utilizzare log4j2, eseguire questi passaggi:

  • Rimuovi il file jar durante il packeging aggiungendo "excludeGroupIds log4j-slf4j-impl / excludeGroupIds"
  • Scopri quale libreria dipende da "logback-classic" usando il comando "mvn dependecy: tree"
  • Ovunque lo trovi escludilo dalla dipendenza.

Questo errore si è verificato perché il logback sovrascrive le modifiche a log4j2. Quindi, se si desidera utilizzare log4j2, è necessario rimuovere la libreria di logback e le dipendenze.

Spero che questo possa aiutare qualcuno.


2

Modo corretto per escludere la registrazione predefinita e configurare log4j per la registrazione.

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

Fare riferimento a Spring Logging - How To .


1

Per aggiungere un'esclusione per il logback da Netbeans IDE

  1. Accedi a> Esplora progetti sezione per il tuo progetto
  2. Vai a> Dipendenze come mostrato di seguito
  3. Traccia "spring-boot-starter-logging-XXXjar"
  4. Fare clic con il tasto destro del mouse sul vaso e selezionare Escludi dipendenza come mostrato di seguito. Ciò esclude il vaso di logback su pom.xml come questo;

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

inserisci qui la descrizione dell'immagine


1

Nel mio caso sotto l'esclusione funziona !!

    <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

Aggiungere esclusioni non era sufficiente per me. Ho dovuto fornire un barattolo falso:

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

1

Il motivo è che lo spring boot viene fornito con logback come configurazione di log predefinita mentre camel utilizza log4j. Questo è il motivo del conflitto. Hai due opzioni, rimuovere il logback dall'avvio primaverile come menzionato nelle risposte sopra o rimuovere log4j da cammello.

<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

Aggiungi semplicemente la configurazione logback.xml nel tuo classpath e aggiungi tutta la tua configurazione con l'appender root aggiunto. Una volta che lo Spring boot completa il caricamento del bean, inizierà la registrazione in base alla configurazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.