programing

spring boot이 logback-spring.xml을 무시합니다.

css3 2023. 10. 22. 20:19

spring boot이 logback-spring.xml을 무시합니다.

로그백을 사용하는 2개의 스프링 부트(1.4.1-RELEASE) 콘솔 애플리케이션이 있습니다.두 구성 파일이 어느 정도 동일하며, 내 /src/main/resource 폴더에 있고 logback-spring.xml이라는 이름을 가지고 있습니다.

두 프로젝트 모두 pom.xml에 maven dependency spring-boot-starter-logging을 포함하고 로그백 버전 1.1.7을 가져옵니다.

두 폼 모두에 정의된 스프링 부트 구성:

<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.xml로 변경하면 갑자기 정상적으로 작동합니다(스프링 프로파일을 사용하더라도).

관련된 구성(pom.xml, application.properties 등을 의미함)에는 뚜렷한 차이가 없습니다.

왜 그런 일인지 아는 사람?저는 이 행동이 다소 혼란스럽다고 생각합니다.

좀 오래된 건 알지만, 같은 문제가 있어서 알아냈어요그 이유는 단순히 클래스 경로에 logback.xml이 있기 때문입니다(somewhere를 들어, 반드시 시작하는 프로젝트에서는 그렇지 않습니다. 제 경우에는 종속성이었습니다).

여기를 보십시오.org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(LoggingInitializationContext, LogFile)

브레이크 포인트를 설정하면 알 수 있습니다.

스프링 부트가 클래스 경로에서 로그백 구성("logback-test.groovy", "logback-test.xml", "logback.groovy", "logback.groovy", "logback.xml")을 찾지 못하면 logback-spring.xml이 선택됩니다.

application.yml에 logging.config를 추가하여 이 문제를 해결하였습니다.

logging:
  config: classpath:logback-spring.xml

application.properties에 그렇게 구성 파일의 위치를 지정합니다.

logging.config=path

스프링이 이 파일 이름을 찾고 있지 않을 수 있습니다.스프링 도크

단순히 logback.xml이 아닌 logback-spring.xml이라는 이름을 사용하는 것이 좋습니다.

가능하면 application.properties에 구성을 넣겠습니다.

Logback을 사용하려면 클래스 경로에 logback과 spring-jcl을 포함해야 합니다.가장 간단한 방법은 스프링-부트-스타터-로깅에 의존하는 스타터를 통해 수행하는 것입니다.웹 응용 프로그램의 경우 로깅 스타터에 따라 전환적으로 달라지므로 스프링 부트 스타터 만 필요합니다.메이븐을 사용하는 경우 다음 종속성에 따라 로깅이 추가됩니다.

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

따라서 로그 종속성을 제거하면 중복됩니다.

네 알겠습니다.

이것은 날조된 질문이라는 것을 압니다.하지만 그래들 토크를 메이븐으로 '번역'할 수는 있습니다.

이 아이디어의 요점은 다음과 같습니다.

내 루트 build.gradle 파일에서.

저는 이 물건들을 제외해야만 했습니다.그래들이 하는 방식은, 이것이 "글로벌 투 이 프로젝트" 유형의 배제이므로, 모든 것을 한 곳에 모이게 됩니다.하지만 동일한 "제외"를 할 수도 있고, 면도를 할 수도 있고, 모양이 다를 뿐입니다.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

'compile 의존성'을 찾아보면 알게 될 겁니다

로그백- classic/1.2.3

가지다

org.slf4j » slf4j-api 1.7.25 1.7.30

그래서 1.7.25에서 1.7.30 사이에 로그백- classic/1.2.3을 사용하면 좋습니다.

아마 더 좋은 방법이 있겠지만, 저는 의존성 게임에서 그렇게 "친해지는" 방법입니다.

    slf4jVersion = "1.7.30"
    logbackClassicVersion = '1.2.3'

하지만 당신은 repostory나 jcenter를 만들어서 이 두 가지 버전 중에서 서로 잘 어울리는 최신 버전을 찾는 것이 좋을 것입니다.

나는 같은 문제에 직면했고, 그 중에 어떤 것이 있는지 찾으려 노력했습니다.logback.xml아니면logback-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>

언급URL : https://stackoverflow.com/questions/43937031/spring-boot-ignoring-logback-spring-xml