他の依存関係(Hibernate、Netty、Minaなど)とともにlog4j2
経由でSpringログを適切に作成するにはどうすればよいですか?
私は多くの異なるシンと依存関係の組み合わせを試しました。しかし、Springにログを記録させ、それ以外は何も記録させないか、Spring以外のすべてを記録させることができます。
すべての依存関係が適切にログに記録されると(ただし、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 this commit で行われたAPIの重大な変更があるため、機能しません。これがあなたが見ているNoSuchMethodError
の原因です。
Log4J2 2.6.2に戻すと、問題が解決するはずです。または、Log4J 2.7を使用するSpring Boot 1.5にアップグレードできます。