Spring Boot忽略logback-spring.xml文件

18

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

这两个项目在它们的pom.xml中都包括Maven依赖项spring-boot-starter-logging,并获取Logback版本1.1.7。

在这两个pom中定义的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,它会突然正常工作(即使使用了我在其中使用的spring配置文件)。

在涉及的任何配置中都没有明显的差异(即pom.xml、application.properties等)。

有人知道为什么会出现这种情况吗?我觉得这种行为相当令人困惑。


您可能有两个不同的Spring Boot应用程序。您应该至少显示它们的pom.xml文件。这些可能会有帮助。 - davidxxx
你在版本号上犯了错误吗?Logback 1.7.1不存在。 - Andy Wilkinson
@AndyWilkinson:没错 - 那是个打字错误。我在帖子中已经更正了。 - Christian Triebstein
@davidxxx:我已经仔细检查了两个pom文件的差异。当然,考虑到这是两个不同的项目,肯定会有一些差异。关于Spring Boot的配置更新部分(从我的角度来看)已经在上面更新了 - 在两个配置中并没有显示任何差异。 - Christian Triebstein
6个回答

32

我知道这可能有些过时了,但是我碰到了同样的问题并解决了它……原因很简单,你的类路径上有一个logback.xml文件(可能不在你启动的项目中,在我的情况下是一个依赖项)。

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

设置断点,然后就会看到。

如果Spring Boot在类路径上没有找到任何logback配置文件("logback-test.groovy"、"logback-test.xml"、"logback.groovy"、"logback.xml"),它将选择logback-spring.xml。


这非常有道理,正是导致问题的原因 - 谢谢。 - Christian Triebstein
非常感谢!这个答案真的救了我的一天。我可能没有注意到我的项目中有一个“隐藏”的logback.xml文件。 - ProtossShuttle

17

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

logging:
  config: classpath:logback-spring.xml

你今天是我的英雄。对我来说,缺少的部分是包括 classpath:。 - undefined

7
我会在application.properties中指定配置文件的位置,如下所示。
logging.config=path

Spring可能不会寻找这个文件名。 Spring文档

他们建议使用这个名称logback-spring.xml而不仅仅是logback.xml。

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


4
我可以做到,但这并不回答为什么该应用程序选择忽略其他应用程序不忽略的相同配置的问题。 - Christian Triebstein

1
要使用Logback,您需要在类路径中包含它和spring-jcl。最简单的方法是通过starters完成,这些starter都依赖于spring-boot-starter-logging。对于Web应用程序,您仅需要spring-boot-starter-web,因为它在传递依赖项中依赖于日志启动器。 如果您使用Maven,则以下依赖项会为您添加日志记录:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

因此,请移除日志依赖项,它是多余的。


0

我遇到了相同的问题,并尝试查找是否在 classpath 中已经存在 logback.xmllogback-groovy.xml 等文件,但并没有找到。

然后我尝试了一些更改:

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

  2. 从pom.xml中删除以下依赖项,改为:

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

0

好的。

我知道这是一个Maven问题。但你可以将Gradle的讨论“翻译”成Maven。

这个想法的要点是:

在我的根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

因此,在1.7.25和1.7.30之间的某个版本将与logback-classic/1.2.3兼容。

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

    slf4jVersion = "1.7.30"
    logbackClassicVersion = '1.2.3'

但你最好去Maven仓库或JCenter找到最新版本,同时也找到这两个东西相互兼容的版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接