Вимкнути зворотний зв'язок у SpringBoot


118

Здається, Springboot автоматично налаштовує себе на використання Logback із Tomcat. Я хотів би відключити це і використовувати той, який я надаю на своєму класі.

Повідомлення про помилку нижче.

LoggerFactory не є Logback LoggerContext, але Logback знаходиться на класі. Видаліть Logback або конкуруючу реалізацію (клас org.slf4j.impl.SimpleLoggerFactory) Об'єкт класу [org.slf4j.impl.SimpleLoggerFactory] повинен бути екземпляром класу 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>

Відповіді:


143

Щоб вирішити конфлікт, додайте виключення як для початкової, так і для початкової завантажувальної програми.

<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
Це не працює для мене , тому що , якщо додати ці винятки , я отримую: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory.
Аріель

2
Після цього вам доведеться надати власний реєстратор, наприклад, log4j у своєму класі. Чому ви бажаєте виключити з вашої програми реєстратори за замовчуванням?
ФОО

1
Чи є спосіб дізнатись, яка баночка оголошує зворотний зв'язок, не проводячи певного дослідження в кожній банці? І, дякую! Це мені допомогло
vivek_ganesan

4
mvn залежність: дерево -Двербоза -Включає = весна-завантажувач-стартер-журнал
FOO

Додавання цього виключення до кожної залежності від весняного завантаження-стартера - це величезні клопоти. Схоже, що Gradle принаймні дозволяє глобальне виключення. Це одне серйозно змушує мене розглянути можливість переходу з Мейвена.
Скоттіссей

59

Щоб додати краще, більш загальне рішення в Gradle (всі екземпляри будуть виключені):

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

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


1
Це працює для мене і щонайменше для 7 інших людей. Я не думаю, що проблема з вашою конфігурацією чи оточенням повинна стати головою для мого рішення (я припустив, що отриманий мною протокол був з вашого коментаря - вибачте, якщо я помиляюся).
HankCa

1
Спробували всі інші конфігурації, це єдиний, який працював на мене
timothyclifford

Це не працює, я все ще бачуspring-boot-starter-logging
Адам Арольд

40

Для додавання розчину в граді.

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

Я виявив, що виключати повний spring-boot-starter-loggingмодуль не потрібно. Все, що потрібно - це виключити org.slf4j:slf4j-log4j12модуль.

Додавання цього до файлу збірки Gradle вирішить проблему:

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

Дивіться цю іншу відповідь StackOverflow для отримання більш детальної інформації.


11

Я люблю це, щоб вирішити свою проблему

<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

Знайдіть тест Spring-boot-starter-test у своєму pom.xml та змініть його наступним чином:

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

Це виправлена ​​помилка на зразок:

_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

Наступні роботи для мене

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

З цим я все ще бачив JARs для зворотного зв'язку в остаточному артефакті (використовував плагін Assembly замість плагіна Maven Boot - тому не впевнений, чи справді він працює з пакуванням Boot)
Janaka Bandara

7

Це може допомогти, якщо ви скажете, який саме ваш бажаний реєстратор, і що ви зробили, щоб спробувати його встановити. Так чи інакше, Spring Boot намагається працювати з тим, що є на класі, тому, якщо ви не хочете зворотного зв'язку, зніміть його з курсу. Є інструкції по log4j в документації , але те ж саме буде застосовуватися в інші підтримувані системи реєстрації (нічого SLF4J, log4j або Java Util).


3
Я використовую slf4j, і я не бачу зворотного зв'язку у своєму файлі Maven pom.
ФОО

Зворотний зв'язок - це реєстратор slf4j. Можливо, ви можете поділитися своєю пом?
Дейв Сайер

Я не бачу явно жодної іншої реалізації slf4j, тому вона повинна надходити транзитивно. Ви можете використовувати такі інструменти, як m2e (Eclipse) або "mvn залежність: дерево" для візуалізації залежностей. Інструмент Eclipse також має графічний інтерфейс для виключення залежностей (це те, що вам потрібно зробити - виключити одну з них). Можливо, буде достатньо виключити "весняний завантажувач-стартер-журнал", якщо у вас вже є повний slf4j (включаючи міст jcl).
Дейв Сайер

5

Я вирішив свою проблему нижче:

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

Це працювало для мене просто чудово

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

Але для користувачів Maven це не вийде . Всі мої залежності були в libs.gradle, і я не хотів їх в інших файлах. Тому ця проблема була вирішена шляхом додавання exclude module : 'spring-boot-starter-loggingв spring-boot-starter-data-jpa, spring-boot-starter-testі практично всі з завантажувальному словом.

ОНОВЛЕННЯ

Новий мій проект потребував оновлення, виявляється, spring-boot-starter-test1,5 і старші не мали spring-boot-starter-logging. У 2.0 є


5

У моєму випадку потрібно було лише виключити spring-boot-starter-loggingартефакт із spring-boot-starter-securityодного.

Це в нещодавно створеному весняному завантаженні 2.2.6. RELEASE проект, що включає такі залежності:

  • Spring-boot-starter-безпека
  • перевірка весняного завантаження-стартера
  • Весна-завантаження-стартер-павутина
  • весняно-завантажувальний-стартер-тест

Я дізнався, бігаючи mvn dependency:treeі шукаючи ch.qos.logback.

Весняний черевик, пов'язаний <dependencies>в моєму, pom.xmlвиглядає так:

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

Він працював після виключення весняного завантаження-стартера-лісозаготівлі
Prateek Mehta

4

Додайте це до свого 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

Якщо ця помилка сталася у SpringBoot під час спроби використання log4j2, виконайте наступні дії:

  • Видаліть банку з пакетування, додавши це "виключитиGroupIds log4j-slf4j-impl / виключитиGroupIds"
  • Дізнайтеся, яка бібліотека залежить від "класичного зворотного зв'язку", скориставшись командою "mvn залежність: дерево"
  • Де б ви не знаходили, виключайте це із залежності.

Ця помилка сталася через те, що зворотний зв'язок замінює зміни log4j2. Так, якщо ви хочете використовувати log4j2, вам доведеться видалити бібліотеку зворотного зв'язку та залежності.

Сподіваюся, що це комусь допоможе.


2

Правильний спосіб виключення журналу за замовчуванням та налаштування log4j для ведення журналів.

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

См. Весняний лісозаготівлю - як це зробити .


1

Щоб додати виключення для відтворення з ID ID Netbeans

  1. Доступ до розділу > Провідник проектів для свого проекту
  2. Перейдіть до> Залежності, як показано нижче
  3. Простежте "весняний завантажувач-стартер-реєстрація-XXXjar"
  4. Клацніть правою кнопкою миші на баночці та виберіть Виключити залежність, як показано нижче. Це виключає банку для зворотного зв'язку на pom.xml так;

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

введіть тут опис зображення


1

У моєму випадку нижче виключення працює !!

    <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

Додавання виключень для мене було недостатньо. Я повинен був надати підроблену банку:

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

1

Причина полягає в тому, що весняний черевик поставляється із зворотним зв'язком як його стандартною конфігурацією журналу, тоді як верблюд використовує log4j. У цьому причина конфлікту. У вас є два варіанти: або видалити logback з весняного завантаження, як згадувалося вище у відповідях, або видалити log4j з верблюда.

<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

Просто додайте конфігурацію logback.xml у свій класний шлях та додайте всю свою конфігурацію із доданим кореневим додатком. Як тільки весняне завантаження завершить завантаження бобів, воно почне вести журнал, виходячи з вашої конфігурації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.