Nonaktifkan Logback di SpringBoot

118

Tampaknya Springboot mengonfigurasi dirinya sendiri untuk menggunakan Logback dengan Tomcat. Saya ingin menonaktifkan ini dan menggunakan yang saya sediakan di classpath saya.

Pesan kesalahan di bawah ini.

LoggerFactory bukan Logback LoggerContext, tetapi Logback ada di classpath. Hapus Logback atau implementasi yang bersaing (kelas org.slf4j.impl.SimpleLoggerFactory) Objek kelas [org.slf4j.impl.SimpleLoggerFactory] harus berupa turunan dari kelas 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>
FOO
sumber

Jawaban:

143

Tambahkan pengecualian ke web spring-boot-starter dan spring-boot-starter-web untuk menyelesaikan konflik.

<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
sumber
3
Ini tidak bekerja untuk saya karena jika saya menambahkan mereka pengecualian saya mendapatkan: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory.
Ariel
2
Setelah Anda melakukan ini, Anda harus menyediakan logger Anda sendiri misalnya log4j di classpath Anda. Mengapa Anda ingin mengecualikan logger default dari aplikasi Anda?
FOO
1
Adakah cara untuk mengetahui toples mana yang menyatakan logback tanpa melakukan 'eksplorasi' di setiap toples? Dan terimakasih! Ini membantu saya
vivek_ganesan
4
ketergantungan mvn: tree -Dverbose -Dincludes = spring-boot-starter-logging
FOO
harus menambahkan pengecualian ini ke setiap dependensi spring-boot-starter- * sangat merepotkan. Sepertinya Gradle setidaknya memungkinkan pengecualian global. Ini saja membuat saya serius mempertimbangkan untuk beralih dari Maven.
scottysseus
59

Untuk menambahkan solusi yang lebih baik dan lebih umum di Gradle (semua instance akan dikecualikan):

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

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

HankCa
sumber
1
Itu berhasil untuk saya dan setidaknya 7 orang lainnya. Saya tidak berpikir masalah dengan konfigurasi atau lingkungan Anda seharusnya menjadi downvote untuk solusi saya (saya berasumsi downvote yang saya terima berasal dari komentar Anda - maaf jika saya salah).
HankCa
1
Telah mencoba semua konfigurasi lain, ini adalah satu-satunya yang berhasil untuk saya
timothyclifford
Ini tidak berhasil, saya masih melihatspring-boot-starter-logging
Adam Arold
40

Untuk menambahkan solusi dalam 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.
sumber
14

Saya menemukan bahwa mengecualikan spring-boot-starter-loggingmodul penuh tidak diperlukan. Semua yang diperlukan adalah mengecualikan org.slf4j:slf4j-log4j12modul.

Menambahkan ini ke file build Gradle akan menyelesaikan masalah:

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

Lihat jawaban StackOverflow lainnya ini untuk lebih jelasnya.

Andrew
sumber
11

Saya suka ini untuk menyelesaikan masalah saya

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

Temukan spring-boot-starter-test di pom.xml Anda dan modifikasi sebagai berikut:

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

Itu memperbaiki kesalahan seperti:

_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**
Tanya saya
sumber
7

Mengikuti berhasil untuk saya

<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
sumber
Dengan ini saya masih melihat JAR logback di artefak terakhir (menggunakan plugin Assembly, bukan plugin Maven Boot - jadi tidak yakin apakah itu benar-benar berfungsi dengan paket Boot)
Janaka Bandara
7

Mungkin membantu jika Anda mengatakan apa sebenarnya logger pilihan Anda, dan apa yang Anda lakukan untuk mencoba dan menginstalnya. Bagaimanapun, Spring Boot mencoba bekerja dengan apa pun yang ada di classpath, jadi jika Anda tidak ingin logback, lepaskan dari classpath. Ada instruksi untuk log4j di dokumen , tetapi hal yang sama akan berlaku untuk sistem logging lain yang didukung (apapun slf4j, log4j atau java util).

Dave Syer
sumber
3
Saya menggunakan slf4j dan saya tidak dapat melihat logback di file pom maven saya.
FOO
Logback adalah logger slf4j. Mungkin Anda bisa membagikan pom Anda?
Dave Syer
Saya tidak bisa melihat implementasi slf4j lainnya secara eksplisit, jadi itu harus datang secara transitif. Anda dapat menggunakan alat seperti m2e (Eclipse) atau "mvn dependency: tree" untuk memvisualisasikan dependensi. Perkakas Eclipse juga memiliki GUI untuk mengecualikan dependensi (itulah yang perlu Anda lakukan - kecualikan salah satunya). Mungkin sudah cukup untuk mengecualikan "spring-boot-starter-logging" jika Anda sudah memiliki slf4j lengkap (termasuk jembatan jcl).
Dave Syer
5

Saya menyelesaikan masalah saya melalui ini di bawah:

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'
}
Leo
sumber
5

Ini berhasil bagi saya dengan baik

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

Tapi itu tidak akan berhasil untuk pengguna maven . Semua dependensi saya ada di libs.gradle dan saya tidak menginginkannya di file lain. Jadi ini masalah diselesaikan dengan menambahkan exclude module : 'spring-boot-starter-loggingdi spring-boot-starter-data-jpa, spring-boot-starter-testdan di hampir segala sesuatu dengan kata booting.

MEMPERBARUI

Proyek baru saya membutuhkan pembaruan, ternyata spring-boot-starter-test1.5 dan yang lebih lama tidak memilikinya spring-boot-starter-logging. 2.0 memilikinya

Dennis Glot
sumber
5

Dalam kasus saya, itu hanya diperlukan untuk mengecualikan spring-boot-starter-loggingartefak dari spring-boot-starter-securitysatu.

Ini ada dalam spring boot 2.2.6. Proyek RELEASE yang baru dibuat termasuk dependensi berikut:

  • pegas-boot-starter-keamanan
  • validasi spring-boot-starter
  • pegas-boot-starter-web
  • uji pegas-boot-starter

Saya mengetahuinya dengan berlari mvn dependency:treedan mencari ch.qos.logback.

Sepatu bot musim semi terkait <dependencies>dalam pom.xmlpenampilanku seperti ini:

    <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
sumber
Ini bekerja setelah mengecualikan musim semi-boot-starter-logging
Prateek Mehta
4

Tambahkan ini di build.gradle Anda

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

Jika kesalahan ini terjadi di SpringBoot saat Anda mencoba menggunakan log4j2, lakukan langkah-langkah berikut:

  • Hapus toples dari saat mengemas dengan menambahkan "excludeGroupIds log4j-slf4j-impl / excludeGroupIds" ini
  • Cari tahu library mana yang bergantung pada "logback-classic" dengan menggunakan perintah "mvn dependecy: tree"
  • Di mana pun Anda menemukannya, kecualikan dari dependensi.

Kesalahan ini terjadi karena logback menimpa perubahan log4j2. SO jika Anda ingin menggunakan log4j2 maka Anda harus menghapus library logback dan dependensi.

Semoga ini bisa membantu seseorang.

Atul
sumber
2

Cara yang benar untuk mengecualikan logging default, dan mengkonfigurasi log4j untuk logging.

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

Lihat Musim Semi Logging - Cara .

TechFree
sumber
1

Untuk menambahkan pengecualian untuk logback dari Netbeans IDE

  1. Akses> Projects explorer bagian untuk proyek Anda
  2. Lanjutkan ke> Dependensi seperti yang ditampilkan di bawah ini
  3. Lacak 'spring-boot-starter-logging-XXXjar'
  4. Klik kanan pada toples dan pilih Exclude Dependency seperti yang ditunjukkan di bawah ini. Ini mengecualikan tabung logback di pom.xml seperti ini;

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

masukkan deskripsi gambar di sini

Dun0523
sumber
1

Dalam kasus saya di bawah pengecualian berfungsi !!

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

Menambahkan pengecualian saja tidak cukup bagi saya. Saya harus memberikan toples palsu:

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

Pasalnya, spring boot hadir dengan logback sebagai konfigurasi log default-nya, sedangkan camel menggunakan log4j. Itulah alasan konflik. Anda memiliki dua opsi, hapus logback dari boot musim semi seperti yang disebutkan dalam jawaban di atas atau hapus log4j dari unta.

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

Cukup tambahkan konfigurasi logback.xml di classpath Anda dan tambahkan semua konfigurasi Anda dengan menambahkan appender root. Setelah Spring boot selesai memuat kacang, itu akan mulai logging berdasarkan konfigurasi Anda.

Sakthivel thangasamy
sumber