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>

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>

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


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

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 .


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>


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

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>

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


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

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


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>


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

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.


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


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


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>

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>

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>

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.