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)
build.gradle
dépendancesdependencies {
// 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.
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?
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.