Deaktivieren Sie die Rückmeldung in SpringBoot

118

Es scheint, dass Springboot sich automatisch so konfiguriert, dass Logback mit Tomcat verwendet wird. Ich möchte dies deaktivieren und den in meinem Klassenpfad angegebenen verwenden.

Die Fehlermeldung unten.

LoggerFactory ist kein Logback LoggerContext, aber Logback befindet sich im Klassenpfad. Entfernen Sie entweder Logback oder die konkurrierende Implementierung (Klasse org.slf4j.impl.SimpleLoggerFactory). Das Objekt der Klasse [org.slf4j.impl.SimpleLoggerFactory] muss eine Instanz der Klasse ch.qos.logback.classic.LoggerContext sein

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

Antworten:

143

Fügen Sie sowohl dem Spring-Boot-Starter- als auch dem Spring-Boot-Starter-Web einen Ausschluss hinzu, um den Konflikt zu lösen.

<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
quelle
3
Es funktioniert nicht für mich, denn wenn ich diese Ausschlüsse hinzufüge, bekomme ich : java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory.
Ariel
2
Sobald Sie dies getan haben, müssen Sie Ihren eigenen Logger, z. B. log4j, in Ihrem Klassenpfad bereitstellen. Warum möchten Sie die Standardlogger von Ihrer Anwendung ausschließen?
FOO
1
Gibt es eine Möglichkeit herauszufinden, welches Glas die Rückmeldung deklariert, ohne in jedem Glas eine Erkundung durchzuführen? Und danke! Dies half mir
vivek_ganesan
4
MVN-Abhängigkeit: Baum -Dverbose -Dincludes = Spring-Boot-Starter-Protokollierung
FOO
Diesen Ausschluss zu jeder Spring-Boot-Starter- * Abhängigkeit hinzufügen zu müssen, ist ein großer Aufwand. Gradle scheint zumindest einen globalen Ausschluss zuzulassen. Dies allein bringt mich ernsthaft dazu, über einen Wechsel von Maven nachzudenken.
Scottysseus
59

Um eine bessere, allgemeinere Lösung in Gradle hinzuzufügen (alle Instanzen werden ausgeschlossen):

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

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

HankCa
quelle
1
Das funktioniert für mich und mindestens 7 andere Leute. Ich denke nicht, dass ein Problem mit Ihrer Konfiguration oder Umgebung ein Downvote für meine Lösung sein sollte (ich nahm an, dass das Downvote, das ich erhalten habe, aus Ihrem Kommentar stammt - entschuldigen Sie, wenn ich falsch liege).
HankCa
1
Habe alle anderen Konfigurationen ausprobiert, dies ist die einzige, die für mich funktioniert hat
Timothy Clifford
Das funktioniert nicht, ich sehe immer nochspring-boot-starter-logging
Adam Arold
40

Hinzufügen einer Lösung 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'
    }
}
Amer A.
quelle
14

Ich fand, dass spring-boot-starter-logginges nicht notwendig ist , das gesamte Modul auszuschließen . Sie müssen lediglich das org.slf4j:slf4j-log4j12Modul ausschließen.

Durch Hinzufügen dieser Datei zu einer Gradle-Builddatei wird das Problem behoben:

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

Weitere Informationen finden Sie in dieser anderen StackOverflow- Antwort .

Andrew
quelle
11

Ich mag das, um mein Problem zu lösen

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

Finden Sie den Spring-Boot-Starter-Test in Ihrer pom.xml und ändern Sie ihn wie folgt:

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

Es wurde ein Fehler behoben wie:

_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**
Frag mich
quelle
7

Das Folgende funktioniert für mich

<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
quelle
Damit sah ich immer noch die Logback-JARs im letzten Artefakt (verwendete das Assembly-Plugin anstelle des Maven-Plugins von Boot - also nicht sicher, ob es tatsächlich mit der Boot-Verpackung funktioniert)
Janaka Bandara
7

Es kann hilfreich sein, wenn Sie angeben, was Ihr bevorzugter Logger genau ist und was Sie getan haben, um ihn zu installieren. Wie auch immer, Spring Boot versucht, mit allem zu arbeiten, was sich im Klassenpfad befindet. Wenn Sie also keine Rückmeldung wünschen, entfernen Sie es aus dem Klassenpfad. Es gibt Anweisungen für log4j in den Dokumenten , aber das Gleiche gilt für andere unterstützte Protokollierungssysteme (alles, was slf4j, log4j oder Java Util ist).

Dave Syer
quelle
3
Ich benutze slf4j und kann kein Logback in meiner Maven Pom-Datei sehen.
FOO
Logback ist ein slf4j-Logger. Vielleicht kannst du deinen Pom teilen?
Dave Syer
Ich kann keine anderen slf4j-Implementierungen explizit sehen, daher muss sie transitiv eingehen. Sie können Tools wie m2e (Eclipse) oder "mvn dependency: tree" verwenden, um die Abhängigkeiten zu visualisieren. Das Eclipse-Tool verfügt außerdem über eine grafische Benutzeroberfläche zum Ausschließen von Abhängigkeiten (genau das müssen Sie tun - eine davon ausschließen). Es kann ausreichend sein, "Spring-Boot-Starter-Logging" auszuschließen, wenn Sie bereits über ein vollständiges slf4j (einschließlich der jcl-Brücke) verfügen.
Dave Syer
5

Ich habe mein Problem folgendermaßen gelöst:

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'
}
Löwe
quelle
5

Das hat bei mir ganz gut funktioniert

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

Aber für Maven- Benutzer würde es nicht funktionieren . Alle meine Abhängigkeiten waren in libs.gradle und ich wollte sie nicht in anderen Dateien. Also das war Problem gelöst durch Zugabe von exclude module : 'spring-boot-starter-loggingin spring-boot-starter-data-jpa, spring-boot-starter-testund in praktisch alles mit Boot - Wort.

AKTUALISIEREN

Mein neues Projekt brauchte ein Update, es stellte sich heraus, dass spring-boot-starter-test1.5 und älter es nicht hatten spring-boot-starter-logging. 2.0 hat es

Dennis Glot
quelle
5

In meinem Fall war es nur erforderlich, das spring-boot-starter-loggingArtefakt von dem spring-boot-starter-securityeinen auszuschließen .

Dies ist in einem neu generierten Spring Boot 2.2.6.RELEASE-Projekt mit den folgenden Abhängigkeiten:

  • Spring-Boot-Starter-Sicherheit
  • Spring-Boot-Starter-Validierung
  • Spring-Boot-Starter-Web
  • Spring-Boot-Starter-Test

Ich fand es heraus, indem ich rannte mvn dependency:treeund suchte ch.qos.logback.

Der Frühlingsstiefel, der <dependencies>in meinem verwandt ist, pom.xmlsieht so aus:

    <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.
quelle
Es funktionierte nach dem Ausschluss der Spring-Boot-Starter-Protokollierung
Prateek Mehta
4

Fügen Sie dies in Ihr build.gradle ein

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

Wenn dieser Fehler in SpringBoot aufgetreten ist, wenn Sie versuchen, log4j2 zu verwenden, führen Sie die folgenden Schritte aus:

  • Entfernen Sie das Glas während des Packegings, indem Sie dieses "excludeGroupIds log4j-slf4j-impl / excludeGroupIds" hinzufügen.
  • Finden Sie mit dem Befehl "mvn dependecy: tree" heraus, welche Bibliothek von "logback-classic" abhängt.
  • Wo immer Sie es finden, schließen Sie es von der Abhängigkeit aus.

Dieser Fehler ist aufgetreten, weil der Logback die log4j2-Änderungen überschreibt. Wenn Sie also log4j2 verwenden möchten, müssen Sie die Logback-Bibliothek und Abhängigkeiten entfernen.

Hoffe das wird jemandem helfen.

Atul
quelle
2

Richtige Methode zum Ausschließen der Standardprotokollierung und Konfigurieren von log4j für die Protokollierung.

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

Siehe Federprotokollierung - Gewusst wie .

TechFree
quelle
1

So fügen Sie einen Ausschluss für die Rückmeldung von der Netbeans-IDE hinzu

  1. Greifen Sie auf den Abschnitt > Projektexplorer für Ihr Projekt zu
  2. Fahren Sie fort mit> Abhängigkeiten wie unten angezeigt
  3. Trace 'Spring-Boot-Starter-Logging-XXXjar'
  4. Klicken Sie mit der rechten Maustaste auf das Glas und wählen Sie Abhängigkeit ausschließen (siehe unten). Dies schließt das Logback-Jar in der pom.xml wie folgt aus;

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

Geben Sie hier die Bildbeschreibung ein

Dun0523
quelle
1

In meinem Fall unten funktioniert der Ausschluss !!

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

Das Hinzufügen von Ausschlüssen hat mir nicht gereicht. Ich musste ein falsches Glas zur Verfügung stellen:

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

Der Grund dafür ist, dass Spring Boot als Standardprotokollkonfiguration mit Logback geliefert wird, während Camel log4j verwendet. Das ist der Grund für Konflikte. Sie haben zwei Möglichkeiten: Entfernen Sie entweder den Logback vom Spring Boot, wie in den obigen Antworten erwähnt, oder entfernen Sie den log4j vom Kamel.

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

Fügen Sie einfach die Konfiguration logback.xml in Ihren Klassenpfad ein und fügen Sie Ihre gesamte Konfiguration mit hinzugefügtem Root-Appender hinzu. Sobald der Spring-Start das Bean-Laden abgeschlossen hat, beginnt die Protokollierung basierend auf Ihrer Konfiguration.

Sakthivel Thangasamy
quelle