How can I make Spring log properly via log4j2
along with the other dependencies I have (Hibernate, Netty, Mina, etc.)?
I tried many different thins and dependency combinations. But I either can get Spring to log and nothing else, or everything but Spring.
With all dependecies logging properly (but Spring) I get the following error:
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
dependenciesdependencies {
// 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'
}
Then, getting rid of my logging dependencies and adding the dependecy below:
compile 'org.springframework.boot:spring-boot-starter-log4j2:1.4.1.RELEASE'
Spring logging will work, but the other deps logging will not.
main
method (nothing special) 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);
}
So again, how can I get Spring to log properly via log4j2
along with the other dependencies I have?
Spring Boot also supports either Log4j or Log4j 2 for logging configuration, but only if one of them is on the classpath. If you are using the starter poms for assembling dependencies that means you have to exclude Logback and then include your chosen version of Log4j instead.
All the Spring Boot starters depend on spring-boot-starter-logging , which uses Logback by default. For using Log4j2, you need to exclude spring-boot-starter-logging and add spring-boot-starter-log4j2 dependency.
Spring Boot 1.4.1 is built with and supports Log4J 2.6 but you're trying to use 2.7. Unfortunately that doesn't work as there's a breaking API change in 2.7 that was made in this commit. This is the cause of the NoSuchMethodError
that you're seeing.
Dropping back to Log4J2 2.6.2 should fix the problem. Alternatively, you could upgrade to Spring Boot 1.5 which uses Log4J 2.7.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With