Tắt tính năng đăng nhập lại trong SpringBoot


118

Có vẻ như Springboot tự động cấu hình chính nó để sử dụng Logback với Tomcat. Tôi muốn vô hiệu hóa điều này và sử dụng cái tôi cung cấp trong classpath của mình.

Thông báo lỗi bên dưới.

LoggerFactory không phải là Logback LoggerContext nhưng Logback nằm trên classpath. Xóa Logback hoặc triển khai cạnh tranh (class org.slf4j.impl.SimpleLoggerFactory) Đối tượng của lớp [org.slf4j.impl.SimpleLoggerFactory] phải là một phiên bản của lớp 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>

Câu trả lời:


143

Thêm loại trừ vào cả spring-boot-starter và spring-boot-starter-web để giải quyết xung đột.

<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
Nó không làm việc cho tôi, vì nếu tôi thêm những loại trừ tôi nhận được: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory.
Ariel

2
Khi bạn thực hiện việc này, bạn sẽ phải cung cấp trình ghi nhật ký của riêng mình, ví dụ như log4j trong đường dẫn thông tin của bạn. Tại sao bạn muốn loại trừ các trình ghi mặc định khỏi ứng dụng của mình?
FOO

1
Có cách nào để tìm ra jar nào khai báo logback mà không cần thực hiện một số 'thăm dò' trong mỗi jar không? Và cảm ơn! Điều này đã giúp tôi
vivek_ganesan

4
phụ thuộc mvn: cây -Dverbose -Dincludes = mùa xuân-boot-khởi-logging
FOO

việc phải thêm loại trừ này vào mỗi phụ thuộc spring-boot-starter- * là một rắc rối lớn. Có vẻ như Gradle ít nhất cũng cho phép loại trừ toàn cầu. Chỉ riêng điều này đã khiến tôi nghiêm túc xem xét việc chuyển từ Maven.
scottysseus

59

Để thêm một giải pháp tốt hơn, chung chung hơn trong Gradle (tất cả các trường hợp sẽ bị loại trừ):

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

Từ https://docs.gradle.org/current/userguide/dependency_management.html


1
Điều đó hiệu quả với tôi và ít nhất 7 người khác. Tôi không nghĩ rằng vấn đề với cấu hình hoặc môi trường của bạn nên là một phản đối cho giải pháp của tôi (Tôi cho rằng phản đối mà tôi nhận được là từ nhận xét của bạn - xin lỗi nếu tôi sai).
HankCa

1
Đã thử tất cả các cấu hình khác, đây là cấu hình duy nhất phù hợp với tôi
timothyclifford

Điều này không hiệu quả, tôi vẫn thấy spring-boot-starter-logging
Adam Arold

40

Để thêm một giải pháp trong 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

Tôi thấy rằng việc loại trừ toàn bộ spring-boot-starter-loggingmô-đun là không cần thiết. Tất cả những gì cần thiết là loại trừorg.slf4j:slf4j-log4j12 mô-đun.

Thêm tệp này vào tệp bản dựng Gradle sẽ giải quyết được sự cố:

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

Xem câu trả lời StackOverflow khác này để biết thêm chi tiết.


11

Tôi làm như vậy để giải quyết vấn đề của tôi

<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

Tìm spring-boot-starter-test trong pom.xml của bạn và sửa đổi nó như sau:

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

Nó đã sửa lỗi như:

_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

Sau đây làm việc cho tôi

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

Với điều này, tôi vẫn thấy các JAR đăng nhập trong tạo tác cuối cùng (đang sử dụng plugin Assembly thay vì plugin Boot's Maven - vì vậy không chắc liệu nó có thực sự hoạt động với đóng gói Khởi động hay không)
Janaka Bandara

7

Sẽ có ích nếu bạn nói chính xác trình ghi ưa thích của mình là gì và bạn đã làm gì để thử và cài đặt nó. Dù sao, Spring Boot cố gắng làm việc với bất cứ thứ gì có trong classpath, vì vậy nếu bạn không muốn logback, hãy gỡ nó ra khỏi classpath. Có hướng dẫn cho log4j trong tài liệu , nhưng điều tương tự sẽ áp dụng cho các hệ thống ghi nhật ký được hỗ trợ khác (bất kỳ thứ gì slf4j, log4j hoặc java use).


3
Tôi sử dụng slf4j và tôi không thể thấy đăng nhập lại trong tệp maven pom của mình.
FOO

Logback một trình ghi nhật ký slf4j. Có lẽ bạn có thể chia sẻ pom của bạn?
Dave Syer

Tôi không thể nhìn thấy bất kỳ triển khai slf4j nào khác một cách rõ ràng, vì vậy nó phải được chuyển sang một cách tạm thời. Bạn có thể sử dụng các công cụ như m2e (Eclipse) hoặc "mvn dependency: tree" để hình dung các phụ thuộc. Công cụ Eclipse cũng có GUI để loại trừ các phụ thuộc (đó là những gì bạn cần làm - loại trừ một trong số chúng). Có thể chỉ cần loại trừ "spring-boot-starter-logging" nếu bạn đã có một slf4j hoàn chỉnh (bao gồm cả cầu jcl).
Dave Syer

5

Tôi đã giải quyết vấn đề của mình thông qua điều này dưới đây:

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

Điều này phù hợp với tôi

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

Nhưng nó sẽ không hiệu quả đối với người dùng maven . Tất cả các phụ thuộc của tôi đều nằm trong libs.gradle và tôi không muốn chúng nằm trong các tệp khác. Vì vậy, vấn đề này đã được giải quyết bằng cách thêm exclude module : 'spring-boot-starter-loggingvào spring-boot-starter-data-jpa,spring-boot-starter-test và trong thực tế tất cả mọi thứ với từ khởi động.

CẬP NHẬT

Dự án mới của tôi cần một bản cập nhật, hóa ra spring-boot-starter-test1.5 trở lên không có spring-boot-starter-logging. 2.0 có nó


5

Trong trường hợp của tôi, chỉ cần loại trừ spring-boot-starter-logginghiện vật khỏispring-boot-starter-security một.

Đây là một dự án khởi động mùa xuân 2.2.6.RELEASE mới được tạo bao gồm các phần phụ thuộc sau:

  • Spring-boot-starter-security
  • Spring-boot-starter-validation
  • spring-boot-starter-web
  • Spring-boot-starter-test

Tôi đã tìm ra bằng cách chạy mvn dependency:treevà tìm kiếm ch.qos.logback.

Khởi động lò xo liên quan <dependencies>trong của tôi pom.xmltrông như thế này:

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

Nó đã hoạt động sau khi loại trừ ghi nhật ký mùa xuân - khởi động
Prateek Mehta

4

Thêm cái này vào build.gradle của bạn

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

Nếu lỗi này xảy ra trong SpringBoot khi bạn đang cố gắng sử dụng log4j2 thì hãy làm theo các bước sau:

  • Loại bỏ jar khỏi khi đang chạy nhanh bằng cách thêm cái này "removeeGroupIds log4j-slf4j-impl /ludeGroupIds"
  • Tìm thư viện phụ thuộc vào "logback-classic" bằng cách sử dụng lệnh "mvn dependecy: tree"
  • Bất cứ nơi nào bạn tìm thấy nó, loại trừ nó khỏi sự phụ thuộc.

Lỗi này xảy ra do đăng nhập ghi đè các thay đổi của log4j2. VẬY nếu bạn muốn sử dụng log4j2 thì bạn phải xóa thư viện logback và các phụ thuộc.

Hy vọng điều này sẽ giúp một ai đó.


2

Cách đúng để loại trừ ghi nhật ký mặc định và định cấu hình log4j để ghi nhật ký.

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

Tham khảo Ghi nhật ký mùa xuân - Cách thực hiện .


1

Để thêm một loại trừ cho đăng nhập lại từ Netbeans IDE

  1. Truy cập> Trình khám phá dự án cho dự án của bạn
  2. Tiếp tục đến> Phụ thuộc như hiển thị bên dưới
  3. Theo dõi 'spring-boot-starter-logging-XXXjar'
  4. Nhấp chuột phải vào bình và chọn Loại trừ Phụ thuộc như hình bên dưới. Điều này không bao gồm bình đăng nhập trên pom.xml như thế này;

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

nhập mô tả hình ảnh ở đây


1

Trong trường hợp của tôi, loại trừ hoạt động dưới đây !!

    <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

Thêm các loại trừ là không đủ đối với tôi. Tôi đã phải cung cấp một cái lọ giả:

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

1

Lý do là, Spring boot đi kèm với logback làm cấu hình log mặc định của nó trong khi camel sử dụng log4j. Đó là lý do của xung đột. Bạn có hai tùy chọn, hoặc xóa logback khỏi khởi động mùa xuân như đã đề cập trong các câu trả lời ở trên hoặc xóa log4j khỏi lạc đà.

<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

Chỉ cần thêm cấu hình logback.xml trong đường dẫn classpath của bạn và thêm tất cả cấu hình của bạn với phần mềm root được thêm vào. Sau khi khởi động Spring hoàn tất quá trình tải bean, nó sẽ bắt đầu ghi nhật ký dựa trên cấu hình của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.