Wyłącz logowanie w SpringBoot

118

Wygląda na to, że Springboot automatycznie konfiguruje się do używania Logback z Tomcat. Chciałbym to wyłączyć i użyć tego, który podam w mojej ścieżce klas.

Komunikat o błędzie poniżej.

LoggerFactory nie jest Logback LoggerContext, ale Logback znajduje się w ścieżce klasy. Usuń Logback lub konkurencyjną implementację (klasa org.slf4j.impl.SimpleLoggerFactory). Obiekt klasy [org.slf4j.impl.SimpleLoggerFactory] musi być instancją klasy 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>
BLA
źródło

Odpowiedzi:

143

Dodaj wykluczenie zarówno do spring-boot-starter, jak i spring-boot-starter-web, aby rozwiązać konflikt.

<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>
BLA
źródło
3
To nie działa na mnie, bo jeśli dodać te wykluczenia uzyskać: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory.
Ariel
2
Gdy to zrobisz, będziesz musiał podać swój własny rejestrator, np. Log4j w swojej ścieżce klas. Dlaczego chcesz wykluczyć domyślne loggery ze swojej aplikacji?
FOO,
1
Czy istnieje sposób, aby dowiedzieć się, który słoik deklaruje logback bez wykonywania pewnych „eksploracji” w każdym z nich? I dzięki! To mi pomogło
vivek_ganesan
4
Zależność mvn: drzewo -Dverbose -Dincludes = spring-boot-starter-logging
FOO
konieczność dodawania tego wykluczenia do każdej zależności „spring-boot-starter- *” jest ogromnym kłopotem. Wygląda na to, że Gradle przynajmniej dopuszcza globalne wykluczenie. Już samo to sprawia, że ​​poważnie rozważam przejście z Mavena.
scottysseus
59

Aby dodać lepsze, bardziej ogólne rozwiązanie w Gradle (wszystkie wystąpienia zostaną wykluczone):

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

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

HankCa
źródło
1
To działa dla mnie i co najmniej 7 innych osób. Nie sądzę, że problem z twoją konfiguracją lub środowiskiem powinien być negatywnym głosem dla mojego rozwiązania (założyłem, że otrzymałem negatywną opinię z twojego komentarza - przepraszam, jeśli się mylę).
HankCa
1
Wypróbowałem wszystkie inne konfiguracje, jest to jedyna, która działała dla mnie
timothyclifford
To nie działa, nadal widzęspring-boot-starter-logging
Adam Arold
40

Aby dodać rozwiązanie w 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.
źródło
14

Okazało się, że wykluczenie pełnego spring-boot-starter-loggingmodułu nie jest konieczne. Wszystko, co jest potrzebne, to wykluczyć org.slf4j:slf4j-log4j12moduł.

Dodanie tego do pliku kompilacji Gradle rozwiąże problem:

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

Aby uzyskać więcej informacji, zobacz tę inną odpowiedź StackOverflow .

Andrzej
źródło
11

Lubię to, aby rozwiązać mój problem

<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
źródło
9

Znajdź test spring-boot-starter-test w swoim pom.xml i zmodyfikuj go w następujący sposób:

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

Naprawiono błąd, taki jak:

_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**
Zapytaj mnie
źródło
7

Poniższe działa dla mnie

<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
źródło
W związku z tym nadal widziałem pliki JAR logowania w ostatnim artefakcie (używałem wtyczki Assembly zamiast wtyczki Boot's Maven - więc nie jestem pewien, czy faktycznie działa z pakietem Boot)
Janaka Bandara
7

Może pomóc, jeśli powiesz, jaki dokładnie jest twój preferowany program rejestrujący i co zrobiłeś, aby go zainstalować. W każdym razie, Spring Boot próbuje pracować ze wszystkim, co znajduje się w ścieżce klas, więc jeśli nie chcesz logback, usuń to ze ścieżki klas. Są to instrukcje log4j w docs , ale to samo będzie dotyczyć innych obsługiwanych systemów rejestrowania (wszystko slf4j, Log4J lub java util).

Dave Syer
źródło
3
Używam slf4j i nie widzę logbacka w moim pliku pom maven.
FOO
Logback to logger slf4j. Może możesz podzielić się swoim pom?
Dave Syer
Nie widzę jawnie żadnych innych implementacji slf4j, więc musi pojawiać się przejściowo. Do wizualizacji zależności można użyć narzędzi takich jak m2e (Eclipse) lub „mvn dependency: tree”. Narzędzie Eclipse ma również GUI do wykluczania zależności (to właśnie musisz zrobić - wykluczyć jedną z nich). Może być wystarczające wyłączenie „spring-boot-starter-logging”, jeśli masz już kompletny slf4j (łącznie z mostkiem jcl).
Dave Syer
5

Rozwiązałem swój problem w następujący sposób:

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'
}
Lew
źródło
5

To zadziałało dla mnie dobrze

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

Ale to nie zadziała dla użytkowników maven . Wszystkie moje zależności znajdowały się w libs.gradle i nie chciałem ich w innych plikach. Więc ten problem został rozwiązany przez dodanie exclude module : 'spring-boot-starter-loggingw spring-boot-starter-data-jpa, spring-boot-starter-testi praktycznie wszystko z bagażnika słowa.

AKTUALIZACJA

Mój nowy projekt wymagał aktualizacji, okazuje się, że spring-boot-starter-test1.5 i starsze nie miały spring-boot-starter-logging. 2.0 ma to

Dennis Glot
źródło
5

W moim przypadku wystarczyło tylko wykluczyć spring-boot-starter-loggingartefakt z tego spring-boot-starter-securityjednego.

Znajduje się w nowo wygenerowanym projekcie Spring Boot 2.2.6.RELEASE zawierającym następujące zależności:

  • zabezpieczenie rozrusznika sprężynowego
  • sprawdzanie poprawności rozruchu sprężynowego rozrusznika
  • spring-boot-starter-web
  • test rozrusznika sprężynowego

Dowiedziałem się biegając mvn dependency:treei szukając ch.qos.logback.

Wiosenny but związany <dependencies>z moim pom.xmlwyglądem wygląda tak:

    <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
źródło
Zadziałało
4

Dodaj to do pliku 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
źródło
2

Jeśli ten błąd wystąpił w SpringBoot podczas próby użycia log4j2, wykonaj następujące kroki:

  • Usuń plik jar z podczas pakowania, dodając to „excludeGroupIds log4j-slf4j-impl / excludeGroupIds”
  • Dowiedz się, która biblioteka jest zależna od „logback-classic”, używając polecenia „mvn dependecy: tree”
  • Gdziekolwiek go znajdziesz, wyklucz go z zależności.

Ten błąd wystąpił, ponieważ logowanie zwrotne zastępuje zmiany log4j2. Więc jeśli chcesz używać log4j2, musisz usunąć bibliotekę logback i zależności.

Mam nadzieję, że to komuś pomoże.

Atul
źródło
2

Poprawny sposób wykluczenia domyślnego rejestrowania i skonfigurowania log4j do rejestrowania.

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

Zobacz Spring Logging - jak to zrobić .

TechFree
źródło
1

Aby dodać wykluczenie dla wylogowania z Netbeans IDE

  1. Przejdź do> Eksploratora projektów sekcji dla swojego projektu
  2. Przejdź do> Zależności jak pokazano poniżej
  3. Śledzenie 'spring-boot-starter-logging-XXXjar'
  4. Kliknij prawym przyciskiem myszy słoik i wybierz opcję Wyklucz zależność, jak pokazano poniżej. To wyklucza słoik logback w pom.xml w ten sposób;

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

wprowadź opis obrazu tutaj

Dun0523
źródło
1

W moim przypadku poniższe wykluczenie działa !!

    <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
źródło
1

Samo dodawanie wykluczeń mi nie wystarczało. Musiałem dostarczyć fałszywy słoik:

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <scope>system</scope>
        <systemPath>${project.basedir}/empty.jar</systemPath>
    </dependency>
Alex R.
źródło
1

Powodem jest to, że Spring Boot ma domyślną konfigurację dziennika z logback, podczas gdy camel używa log4j. To jest przyczyna konfliktu. Masz dwie opcje, albo usuń logback z bagażnika sprężynowego, jak wspomniano w powyższych odpowiedziach, albo usuń log4j z camela.

<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
źródło
0

Po prostu dodaj konfigurację logback.xml do swojej ścieżki klas i dodaj całą konfigurację z dodanym rootem appender. Gdy Spring boot zakończy ładowanie fasoli, rozpocznie rejestrowanie w oparciu o twoją konfigurację.

Sakthivel thangasamy
źródło