Spring Boot ignoring logback-spring.xml

Viewed 17670

I have 2 Spring Boot (1.4.1-RELEASE) console applications using Logback. Both configuration files are more or less identical, are located in my /src/main/resources folder and named logback-spring.xml.

Both projects include the maven dependency spring-boot-starter-logging in their pom.xml and fetch the logback Version 1.1.7.

The Spring Boot config as defined in both poms:

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

However, when running the applications one of them seems to fully ignore the logback configuration while the other picks it up like expected.

If I change the filename to logback.xml for the application that didn't work properly it suddenly works fine (even with the spring profiles that I'm using in them).

There is no apparent difference in any of the configurations involved (meaning the pom.xml, application.properties, etc.).

Does anybody know why that might be the case? I find this behaviour rather confusing.

6 Answers

I solved this problem by adding logging.config in application.yml

logging:
  config: classpath:logback-spring.xml

To use Logback, you need to include it and spring-jcl on the classpath. The simplest way to do that is through the starters, which all depend on spring-boot-starter-logging. For a web application, you need only spring-boot-starter-web, since it depends transitively on the logging starter. If you use Maven, the following dependency adds logging for you:

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

So remove the logging dependency it is redundant.

Ok.

I know this is a maven question. But you can 'translate' gradle talk into maven.

The gist of the idea is:

In my root build.gradle file.

I had to exclude these items. The way gradle does it, is this is a "global to this project" type of exclude, so it gets them ALL in one place. But you can do the same "excluding"/scrubbing in maven, it will just look different. The groupid/artifactid's are what is important.

allprojects {


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


}

Then in my (top layer) build.gradle (I don't have a monolith, I have a project with multiple modules). I added these dependencies:

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

My variable values for the two versions happen to be (at this time of writing this post)

    slf4jVersion = "1.7.30"
    logbackClassicVersion = '1.2.3'

How do you find the 2 versions that play nice together?

For example, if you look at:

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

and find the "compile dependencies", you'll see that

logback-classic/1.2.3

has

org.slf4j » slf4j-api 1.7.25 1.7.30

so somewhere between 1.7.25 and 1.7.30 will play nice with logback-classic/1.2.3

There's probably a better way, but that's how I "get close" at the dependency game.

    slf4jVersion = "1.7.30"
    logbackClassicVersion = '1.2.3'

But you would be better going to maven repostitory or jcenter and finding latest version but also versions that of these 2 things that play nice with each other.

I faced the same issue and tried finding if any of logback.xml or logback-grrovy.xml etc. already in claspath, but was not able to find any

Then I tried some changes:

  1. Changed name from logback.xml to logback-spring.xml

  2. Removed following dependency from pom.xml Instead of

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

I tried this

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