Spring Boot忽略logback-spring.xml

时间:2017-05-12 11:45:28

标签: java maven spring-boot logback

我有2个使用Logback的Spring Boot(1.4.1-RELEASE)控制台应用程序。两个配置文件或多或少相同,位于我的 / src / main / resources 文件夹中,并命名为 logback-spring.xml

两个项目都在其pom.xml中包含maven dependency spring-boot-starter-logging并获取logback Version 1.1.7。

两个poms中定义的Spring Boot配置:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.1.RELEASE</version>
    <relativePath />
</parent>

<groupId>d.m.v.app-a</groupId>
<artifactId>my-app-a</artifactId>
<version>1.0.16-SNAPSHOT</version>
<packaging>jar</packaging>  

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </dependency>
</dependencies>

但是,在运行应用程序时,其中一个似乎完全忽略了logback配置,而另一个则像预期的那样选择了它。

如果我为无法正常工作的应用程序将文件名更改为 logback.xml ,它突然正常工作(即使使用我正在使用的弹簧配置文件)。

所涉及的任何配置(意味着pom.xml,application.properties等)都没有明显的区别。

有人知道为什么会这样吗?我发现这种行为相当令人困惑。

6 个答案:

答案 0 :(得分:9)

我知道它有些陈旧,但我有同样的问题并想出来......所以原因只是你的类路径上有一个logback.xml(某个地方,不一定在你启动的项目中)在我的情况下,这是一个依赖)。

看看这里:org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(LoggingInitializationContext, LogFile)

设置一个断点,然后你会看到。

如果spring boot在类路径上找不到任何回溯配置(“logback-test.groovy”,“logback-test.xml”,“logback.groovy”,“logback.xml”),则为logback-spring。 xml将被拿起。

答案 1 :(得分:3)

我会在application.properties中指定配置文件的位置。

logging.config=path

Spring可能没有找到这个文件名。 Spring doc

他们建议使用此名称​​ logback-spring.xml 而不仅仅是logback.xml

如果可能,我会将配置放在application.properties中。

答案 2 :(得分:0)

要使用Logback,您需要在类路径中包含它和spring-jcl。最简单的方法是通过启动器,它们都依赖于spring-boot-starter-logging。 对于Web应用程序,您只需要 spring-boot-starter-web,因为它依赖于日志记录启动器。如果您使用Maven,则以下依赖项会添加日志记录你:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

因此,删除冗余的日志记录依赖项。

答案 3 :(得分:0)

我通过在application.yml中添加logging.config解决了这个问题

logging:
  config: classpath:logback-spring.xml

答案 4 :(得分:0)

好的。

我知道这是一个棘手的问题。但是您可以将gradle对话“翻译”为maven。

这个主旨是:

在我的root build.gradle文件中。

我不得不排除这些项目。 gradle的方式是,这是“对该项目的全局”排除,因此可以将它们全部放在一个位置。但是您可以在Maven中执行相同的“排除” /清理操作,但外观会有所不同。重要的是groupid / artifactid。

allprojects {


    configurations {
     
        all {
            exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
            exclude group: 'org.springframework.boot', module: 'spring-boot-starter-log4j2'
        }
    }


}

然后在我的(顶层)build.gradle中(我没有一个整体,我有一个带有多个模块的项目)。我添加了这些依赖项:

implementation group: 'ch.qos.logback', name: 'logback-classic', version: logbackClassicVersion
    
implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion

我的两个版本的变量值恰好是(在撰写本文时)

    slf4jVersion = "1.7.30"
    logbackClassicVersion = '1.2.3'

您如何找到两个可以很好地搭配使用的版本?

例如,如果您查看:

https://mvnrepository.com/artifact/ch.qos.logback/logback-classic/1.2.3

找到“编译依赖项”,您会看到

logback-classic / 1.2.3

org.slf4j»slf4j-api 1.7.25 1.7.30

因此,logback-classic / 1.2.3可以很好地介于1.7.25和1.7.30之间

也许有更好的方法,但这就是我在依赖游戏中“接近”的方法。

    slf4jVersion = "1.7.30"
    logbackClassicVersion = '1.2.3'

但是您最好去maven repostitory或jcenter并找到最新版本,并且还要找到这两种相互配合的版本。

答案 5 :(得分:0)

我遇到了同样的问题,并尝试查找 logback.xmllogback-grrovy.xml 等中是否已经存在 claspath,但找不到任何内容

然后我尝试了一些更改:

  1. 将名称从 logback.xml 更改为 logback-spring.xml

  2. 从 pom.xml 中删除了以下依赖项 而不是

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.13</version>
        </dependency>
    

我试过了

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
        </dependency>