Verursacht durch: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl kann nicht mit log4j-to-slf4j vorhanden sein

Lesezeit: 6 Minuten

Benutzeravatar von Alexei
Alexej

In meinem Springboot 2 Projekt:

Im build.gradle:

dependencies {
    implementation 'com.google.code.gson:gson:2.7'
    implementation 'com.h2database:h2'
    implementation 'javax.servlet:jstl:1.2'
    implementation 'org.springframework.boot:spring-boot-devtools'
    implementation('org.springframework.boot:spring-boot-starter') {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-log4j2'
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation "org.springframework.boot:spring-boot-starter-web"

    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }

    testImplementation 'org.junit.jupiter:junit-jupiter:5.5.2'
}

Im src/resources/log4j2.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration debug="true" xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="Console"
              class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <!-- l, L, M - is extremely slow. It's use should be avoided unless execution
                speed is not an issue. -->
            <param name="ConversionPattern"
                   value="%p: %d{dd.MM.yyyy HH:mm:ss.SSS} %l %n    %m%n"/>
        </layout>
    </appender>

    <appender name="File"
              class="org.apache.log4j.DailyRollingFileAppender">
        <param name="Encoding" value="UTF-8"/>
        <param name="File" value="logs/trace.log"/>
        <param name="Append" value="true"/>
        <layout class="org.apache.log4j.PatternLayout">
            <!-- l, L, M - is extremely slow. It's use should be avoided unless execution
                speed is not an issue. -->
            <param name="ConversionPattern"
                   value="%p: %d{dd.MM.yyyy HH:mm:ss.SSS} %l %n    %m%n"/>
        </layout>
    </appender>

    <!-- Application Loggers -->
    <logger name="com.journaldev.spring">
        <level value="info"/>
    </logger>

    <!-- 3rdparty Loggers -->
    <logger name="org.springframework.core">
        <level value="info"/>
    </logger>

    <logger name="org.hibernate">
        <level value="info"/>
    </logger>

    <logger name="org.springframework.beans">
        <level value="info"/>
    </logger>

    <logger name="org.springframework.context">
        <level value="info"/>
    </logger>

    <logger name="org.springframework.web">
        <level value="info"/>
    </logger>

    <!-- The root category is used for all loggers unless a more specific logger
        matches. If none of the loggers are assigned a level, then all loggers inherit
        the level of the root logger which is set to DEBUG by default -->
    <root>
        <level value="ALL"/>
        <appender-ref ref="Console"/>
        <!-- <appender-ref ref="File" /> -->
    </root>

</log4j:configuration>

In meinem Controller:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class CategoryController {
    private CategoryRepository categoryRepository;

    private static Logger logger = LoggerFactory.getLogger(CategoryController.class);

 @GetMapping("/categories")
    public String getCategories(Model model) {
        logger.debug("getCategories>>>>>>>>>>>>>>>>");
        model.addAttribute("categoryList", this.categoryRepository.findAll());
        return "categories/category_list";
    }
}

Aber wenn ich das Projekt starte, bekomme ich einen Fehler:

Verursacht durch: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl kann nicht mit log4j-to-slf4j vorhanden sein

  • Bitte lesen Sie die Dokumentation docs.spring.io/spring-boot/docs/current/reference/htmlsingle/…

    – Simon Martinelli

    7. Januar 2020 um 13:22 Uhr

  • Obwohl es diesen Fehler nicht verursacht, ist die verwendete Konfigurationsdatei für Log4j 1.x und nicht für Log4j 2.

    – rgoers

    8. Januar 2020 um 2:43 Uhr

  • Mit Springboot 2.3.0.RELEASE+ Version unterstützt Log4j2 nativ. Siehe: stackoverflow.com/a/61873064/8718377

    – veben

    12. August 2021 um 11:44 Uhr


Benutzeravatar von nfvp
nfvp

Laut Frühling Dokumentation (wie von Simon hervorgehoben) möchten wir das Modul “spring-boot-starter-logging” davon ausschließen alle Bibliothekennicht nur von “spring-boot-starter-web”.

configurations {
    ...
    all {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
}

…Anstatt von…

dependencies {
    ...
    implementation('org.springframework.boot:spring-boot-starter') {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
}

Ich selbst hatte das gleiche Problem und habe es mit dieser Lösung gelöst.

  • Ich erhalte eine Warnung von Intellij, dass Exclude nicht auf „java.lang.string“ angewendet werden kann.

    – akash bondre

    22. Februar 2021 um 9:11 Uhr


  • Ich denke, das war nur eine Warnung und es hat nach dem Gradle-Build gut funktioniert, danke.

    – akash bondre

    25. Februar 2021 um 9:16 Uhr

  • falls Sie kotlin dsl wie ich verwenden: configurations { all { exclude(group = "org.springframework.boot", module = "spring-boot-starter-logging") } }

    – jkerak

    29. Dezember 2021 um 20:43 Uhr


  • Wie mache ich das oben (von allen Bibliotheken ausschließen), wenn ich Maven anstelle von Gradle verwende? Können Sie bitte das Maven-Äquivalent des oben Gesagten geben?

    – Esani

    4. Dezember um 15:36 Uhr

Frühlingsstiefel 2.3.0.RELEASE Version, Unterstützung Log4j2 nativ für die Protokollierung der Konfiguration, wenn sie sich im Klassenpfad befindet. In diesem Fall können Sie einfach andere log4j-Abhängigkeiten entfernen.

In einem anderen Fall, wenn Sie die Starter zum Zusammenstellen von Abhängigkeiten verwenden, müssen Sie Logback ausschließen und stattdessen log4j 2 einschließen:

Das kann man mit machen Gradl:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-log4j2'
}

configurations {
    all {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
}

Oder mit Maven:

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

Weitere Informationen zur offiziellen Dokumentation: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-configure-log4j-for-logging

Ich habe die Spring Boot-Protokollierung von build.gradle ausgeschlossen, aber das Problem trat weiterhin auf. Es wurde durch Entfernen behoben org.apache.logging.log4j/log4j-slf4j-impl/2.12.1 von .classpath

Entscheiden Sie anhand der Fehlerprotokolle, welches Projekt ausgeschlossen werden soll.

zB für eine Fehlermeldung wie diese: Verursacht durch: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl kann nicht vorhanden sein mit log4j-to-slf4j Ich habe den Gradle Exclude verwendet:

configurations.all {Gruppe ausschließen: ‘org.apache.logging.log4j’

}

Auch nach der Korrektur des Klassenpfads hatte ich das gleiche Problem in STS und Gradle ‘Refresh All’ löste es.

Gayathris Benutzeravatar
Gayathri

Der beste Weg, dies zu lösen, wäre, Gradle-Abhängigkeiten auszuführen und zu ermitteln, woher log4j-to-slf4j kommt, und dieses Modul dann in build.gradle auszuschließen

1436430cookie-checkVerursacht durch: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl kann nicht mit log4j-to-slf4j vorhanden sein

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy