java 如何正确设置 Spring Boot 和 log4j2?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/40389512/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 05:10:44  来源:igfitidea点击:

How to set up Spring Boot and log4j2 properly?

javaloggingspring-bootlog4j2

提问by sargas

How can I make Spring log properly via log4j2along with the other dependencies I have (Hibernate, Netty, Mina, etc.)?

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

I tried many different thins and dependency combinations. But I either can get Spring to log and nothing else, or everything but Spring.

我尝试了许多不同的瘦身和依赖组合。但是我可以让 Spring 记录而不是其他任何东西,或者除了 Spring 之外的所有东西。

With all dependecies logging properly (but Spring) I get the following error:

正确记录所有依赖项(但 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)

This is my build.gradledependencies

这是我的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'
}

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.

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

This is the mainmethod (nothing special)

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

So again, how can I get Spring to log properly via log4j2along with the other dependencies I have?

再说一次,我怎样才能让 Springlog4j2与我拥有的其他依赖项一起正确登录?

回答by Andy Wilkinson

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 NoSuchMethodErrorthat you're seeing.

Spring Boot 1.4.1 是使用 Log4J 2.6 构建的并支持 Log4J 2.6,但您正在尝试使用 2.7。不幸的是,这不起作用,因为在 2.7 中有一个破坏性的 API 更改,该更改是在此提交中进行的。这就是NoSuchMethodError你所看到的原因。

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.

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