web-dev-qa-db-fra.com

Comment configurer correctement Spring Boot et log4j2?

Comment puis-je créer un journal Spring correctement via log4j2 avec les autres dépendances que j'ai (Hibernate, Netty, Mina, etc.)?

J'ai essayé de nombreuses combinaisons minces et de dépendances différentes. Mais je peux soit faire enregistrer Spring et rien d'autre, ou tout sauf Spring.

Avec toutes les dépendances se connectant correctement (mais Spring) j'obtiens l'erreur suivante:

Java.lang.NoSuchMethodError: org.Apache.logging.log4j.core.config.ConfigurationFactory.getConfiguration(Lorg/Apache/logging/log4j/core/config/ConfigurationSource;)Lorg/Apache/logging/log4j/core/config/Configuration;
        at org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.loadConfiguration(Log4J2LoggingSystem.Java:167)
        at org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.loadDefaults(Log4J2LoggingSystem.Java:150)
        at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.Java:75)
        at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.Java:50)
        at org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.initialize(Log4J2LoggingSystem.Java:140)
        at org.springframework.boot.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.Java:277)
        at org.springframework.boot.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.Java:255)
        at org.springframework.boot.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.Java:224)
        at org.springframework.boot.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.Java:200)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.Java:166)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.Java:138)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.Java:121)
        at org.springframework.boot.context.event.EventPublishingRunListener.publishEvent(EventPublishingRunListener.Java:111)
        at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.Java:65)
        at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.Java:54)
        at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.Java:329)
        at org.springframework.boot.SpringApplication.run(SpringApplication.Java:306)
        at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1185)
        at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1174)
        at com.myproject.MyProject.main(MyProject.Java:XX)

C'est mon build.gradle dépendances

dependencies {
    // FIX engine
    compile 'org.quickfixj:quickfixj-all:1.6.2'
    compile 'org.Apache.mina:mina-core:2.0.16'

    // Web API
    compile ('org.springframework.boot:spring-boot-starter-web:1.4.1.RELEASE') {
        // Remove default Spring loggers (where logback takes precedence)
        exclude module: 'spring-boot-starter-logging'
    }

    // Logging
    compile 'org.Apache.logging.log4j:log4j-api:2.7'
    compile 'org.Apache.logging.log4j:log4j-core:2.7'
    compile 'commons-logging:commons-logging:1.2' // for Spring logging
    compile 'org.Apache.logging.log4j:log4j-web:2.7' // for Spring logging
    compile 'org.Apache.logging.log4j:log4j-slf4j-impl:2.7' // for Hibernate logging

    // ORM and Database Driver
    compile 'org.hibernate:hibernate-core:5.2.4.Final'
    compile 'org.postgresql:postgresql:9.4.1209'

    // Key-value store
    compile 'biz.paluch.redis:lettuce:4.1.2.Final'

    // Testing
    // The Groovy language
    compile 'org.codehaus.groovy:groovy-all:2.4.6'
    // Spock testing framework
    testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'
}

Ensuite, se débarrasser de mes dépendances de journalisation et ajouter la dépendance ci-dessous:

 compile 'org.springframework.boot:spring-boot-starter-log4j2:1.4.1.RELEASE'

La journalisation de printemps fonctionnera, mais la journalisation des autres dépôts ne fonctionnera pas.

Ceci est la méthode main (rien de spécial)

    public static void main(String[] args) {
        // Fine tune a few logging settings so they don't log with TRACE or DEBUG levels.
        Configurator.setLevel("org.hibernate", Level.ERROR);
        Configurator.setLevel("org.jboss", Level.ERROR);
        Configurator.setLevel("org.Apache.mina", Level.ERROR);
        Configurator.setLevel("io.netty", Level.ERROR);
        Configurator.setLevel("quickfix.mina", Level.WARN);
        Configurator.setLevel("com.lambdaworks", Level.WARN);

        // ...

        logger.info("FIX Controller started. Loading the API.");

        SpringApplication.run(MyProject.class, args);
    }

Encore une fois, comment puis-je faire en sorte que Spring se connecte correctement via log4j2 avec les autres dépendances que j'ai?

12
sargas

Spring Boot 1.4.1 est construit avec et prend en charge Log4J 2.6 mais vous essayez d'utiliser 2.7. Malheureusement, cela ne fonctionne pas car il y a un changement d'API cassant dans 2.7 qui a été fait dans ce commit . C'est la cause du NoSuchMethodError que vous voyez.

Revenir à Log4J2 2.6.2 devrait résoudre le problème. Vous pouvez également mettre à niveau vers Spring Boot 1.5 qui utilise Log4J 2.7.

22
Andy Wilkinson