Deshabilitar Logback en SpringBoot

118

Parece que Springboot se autoconfigura para usar Logback con Tomcat. Me gustaría deshabilitar esto y usar el que proporciono en mi classpath.

El mensaje de error a continuación.

LoggerFactory no es un Logback LoggerContext pero Logback está en la ruta de clases. Elimine Logback o la implementación de la competencia (clase org.slf4j.impl.SimpleLoggerFactory) El objeto de la clase [org.slf4j.impl.SimpleLoggerFactory] debe ser una instancia de la clase 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
fuente

Respuestas:

143

Agregue exclusión tanto a spring-boot-starter como a spring-boot-starter-web para resolver el conflicto.

<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
fuente
3
No funciona para mí, porque si agrego esas exclusiones me sale: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory.
Ariel
2
Una vez que haga esto, tendrá que proporcionar su propio registrador, por ejemplo, log4j en su classpath. ¿Por qué desea excluir los registradores predeterminados de su aplicación?
FOO
1
¿Hay alguna manera de averiguar qué jar declara logback sin hacer algo de 'exploración' en cada jar? ¡Y gracias! Esto me ayudó
vivek_ganesan
4
Dependencia de mvn: árbol -Dverbose -Dincludes = spring-boot-starter-logging
FOO
tener que agregar esta exclusión a cada dependencia spring-boot-starter- * es una gran molestia. Parece que Gradle al menos permite una exclusión global. Esto por sí solo me está haciendo considerar seriamente cambiar de Maven.
scottysseus
59

Para agregar una solución mejor y más genérica en Gradle (se excluirán todas las instancias):

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

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

HankCa
fuente
1
Eso funciona para mí y al menos otras 7 personas. No creo que un problema con su configuración o entorno deba ser un voto negativo para mi solución (asumí que el voto negativo que recibí era de su comentario, disculpas si me equivoco).
HankCa
1
He probado todas las demás configuraciones, esta es la única que funcionó para mí
timothyclifford
Esto no funciona, todavía veospring-boot-starter-logging
Adam Arold
40

Para agregar una solución en 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.
fuente
14

Descubrí que spring-boot-starter-loggingno es necesario excluir el módulo completo . Todo lo que se necesita es excluir el org.slf4j:slf4j-log4j12módulo.

Agregar esto a un archivo de compilación de Gradle resolverá el problema:

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

Vea esta otra respuesta de StackOverflow para más detalles.

Andrés
fuente
11

Me gusta esto para resolver mi problema

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

Busque spring-boot-starter-test en su pom.xml y modifíquelo de la siguiente manera:

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

Se corrigió un error como:

_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**
Pregúnteme
fuente
7

Siguiendo trabajos para mi

<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
fuente
Con esto, todavía estaba viendo los JAR de inicio de sesión en el artefacto final (estaba usando el complemento de ensamblaje en lugar del complemento Maven de Boot, por lo que no estoy seguro de si realmente funciona con el paquete de arranque)
Janaka Bandara
7

Podría ayudar si dice cuál es exactamente su registrador preferido y qué hizo para intentar instalarlo. De todos modos, Spring Boot intenta trabajar con lo que sea que esté en la ruta de clases, así que si no desea iniciar sesión, quítelo de la ruta de clases. Hay instrucciones para log4j en los documentos , pero lo mismo se aplicaría a otros sistemas de registro compatibles (cualquier cosa slf4j, log4j o java util).

Dave Syer
fuente
3
Utilizo slf4j y no puedo ver el logback en mi archivo maven pom.
FOO
Logback es un registrador slf4j. ¿Quizás puedas compartir tu pom?
Dave Syer
No puedo ver ninguna otra implementación de slf4j explícitamente, por lo que debe estar entrando de forma transitiva. Puede utilizar herramientas como m2e (Eclipse) o "mvn dependency: tree" para visualizar las dependencias. Las herramientas de Eclipse también tienen una GUI para excluir dependencias (eso es lo que debe hacer: excluir una de ellas). Podría ser suficiente excluir "spring-boot-starter-logging" si ya tiene un slf4j completo (incluido el puente jcl).
Dave Syer
5

Resolví mi problema a través de esto a continuación:

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'
}
León
fuente
5

Esto funcionó para mí muy bien

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

Pero no funcionaría para los usuarios expertos . Todas mis dependencias estaban en libs.gradle y no las quería en otros archivos. Por lo que este problema se resolvió mediante la adición exclude module : 'spring-boot-starter-loggingde spring-boot-starter-data-jpa, spring-boot-starter-testy en prácticamente todo con la palabra de arranque.

ACTUALIZAR

El nuevo proyecto mío necesitaba una actualización, resulta que la versión spring-boot-starter-test1.5 y anterior no la tenía spring-boot-starter-logging. 2.0 lo tiene

Dennis Glot
fuente
5

En mi caso, solo era necesario excluir el spring-boot-starter-loggingartefacto del spring-boot-starter-securityuno.

Esto está en un proyecto de arranque de primavera 2.2.6.RELEASE recién generado que incluye las siguientes dependencias:

  • Spring-boot-starter-security
  • validación de arranque de primavera
  • Spring-boot-starter-web
  • prueba de arranque de arranque de primavera

Lo descubrí corriendo mvn dependency:treey buscando ch.qos.logback.

La bota de primavera relacionada <dependencies>en mi se pom.xmlve así:

    <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
fuente
Funcionó después de excluir spring-boot-starter-logging
Prateek Mehta
4

Agregue esto en su 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
fuente
2

Si este error ocurrió en SpringBoot cuando intenta usar log4j2, siga estos pasos:

  • Elimine el frasco mientras empaqueta agregando este "excludeGroupIds log4j-slf4j-impl / excludeGroupIds"
  • Averigüe qué biblioteca depende de "logback-classic" mediante el comando "mvn dependency: tree"
  • Dondequiera que lo encuentre, excluirlo de la dependencia.

Este error se produjo porque el logback anula los cambios de log4j2. Entonces, si desea usar log4j2, debe eliminar la biblioteca de logback y las dependencias.

Espero que esto ayude a alguien.

Atul
fuente
2

Forma correcta de excluir el registro predeterminado y configurar log4j para el registro.

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

Consulte Spring Logging - Cómo .

TechFree
fuente
1

Para agregar una exclusión para el logback de Netbeans IDE

  1. Acceda a la sección > Explorador de proyectos para su proyecto
  2. Proceda a> Dependencias como se muestra a continuación
  3. Seguimiento de 'spring-boot-starter-logging-XXXjar'
  4. Haga clic con el botón derecho en el frasco y seleccione Excluir dependencia como se muestra a continuación. Esto excluye el jar de logback en pom.xml como este;

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

ingrese la descripción de la imagen aquí

Dun0523
fuente
1

En mi caso, la exclusión a continuación funciona !!

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

Agregar exclusiones no fue suficiente para mí. Tuve que proporcionar un frasco falso:

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

La razón es que Spring Boot viene con logback como configuración de registro predeterminada, mientras que camel usa log4j. Ésa es la razón del conflicto. Tiene dos opciones, eliminar logback de spring boot como se menciona en las respuestas anteriores o eliminar log4j de camel.

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

Simplemente agregue la configuración logback.xml en su classpath y agregue toda su configuración con el agregado de raíz agregado. Una vez que el arranque de Spring complete la carga del bean, comenzará a registrar según su configuración.

Sakthivel thangasamy
fuente