如何正确设置Spring Boot和log4j2?

如何通过log4j2以及我拥有的其他依赖项(Hibernate,Netty,Mina等)正确地进行Spring日志记录?

我尝试了很多不同的细节和依赖组合。 但我要么可以让Spring登录而不是其他任何东西,或者除了Spring之外的其他东西。

所有dependecies正确记录(但Spring)我收到以下错误:

 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依赖项

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

然后,摆脱我的日志记录依赖项并添加以下依赖项:

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

Spring日志记录将起作用,但其他deps日志记录不会。

这是main方法(没什么特别的)

  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); } 

再说一遍,我怎样才能让Spring通过log4j2以及我拥有的其他依赖项正确登录?

Spring Boot 1.4.1内置并支持Log4J 2.6,但您尝试使用2.7。 不幸的是,这不起作用,因为在这个提交中2.7中的API发生了重大变化。 这是您所看到的NoSuchMethodError的原因。

退回到Log4J2 2.6.2应该可以解决问题。 或者,您可以升级到使用Log4J 2.7的Spring Boot 1.5。