복붙노트

[SPRING] logback.xml에 Spring 속성 자리 표시자를 사용할 수 없습니다.

SPRING

logback.xml에 Spring 속성 자리 표시자를 사용할 수 없습니다.

Logback을 사용하는 Spring Boot 콘솔 앱이 있습니다. 모든 등록 정보 (응용 프로그램과 Logback)는 클래스 경로의 표준 application.properties 파일로 외부화됩니다. 이러한 속성은 응용 프로그램 자체에서 올바르게 선택되지만 logback.xml 파일에서는 선택되지 않습니다. Spring Boot가 실행되기 전에 logback.xml이 처리되는 것처럼 보이므로 EL 자리 표시자가 처리되지 않습니다.

예를 들어, FileNamePattern을 application.properties에서 사용하면 다음과 같은 결과를 얻을 수 있습니다.

log.filePattern=/%d{yyyy/MM-MMMM/dd-EEEE}

logback.xml에는 다음과 같은 내용이 있습니다.

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <FileNamePattern>${log.logDirectory}${log.filePattern}.log
    </FileNamePattern>
</rollingPolicy>

앱을 실행하면 다음과 같은 오류가 표시됩니다.

ERROR in ch.qos.logback.core.joran.spi.Interpreter@24:25 - 
RuntimeException in Action for tag [rollingPolicy]
java.lang.IllegalStateException: FileNamePattern
[log.logDirectory_IS_UNDEFINEDlog.filePattern_IS_UNDEFINED.log]
does not contain a valid DateToken

비슷한 코드가 다른 Spring (Spring Boot가 아닌) 응용 프로그램에서 제대로 작동하므로 Spring Boot가 조금 다르게 동작하는지 궁금합니다.

@Gary 답장을 보내 주셔서 감사합니다! Spring EL과 Logback 변수의 차이점에 대해 알고 있으면 좋겠다 ... 나는 그 변수들을 구문 분석하는 것이 Spring이라고 가정했다. 나는 그 요소를 가졌지 만 그것은 나를 생각하게했다.

내 application.properties 파일이 jar 파일 외부에 있으므로 Logback은 어디에서 찾을 수 있는지 알지 못했습니다. 내 외부 application.properties 파일에 내 Spring 관련 속성을 유지하고, 로깅 관련 속성을 application- internal.properties 파일 (jar 파일 내부에 있음)로 이동하고 Logback을 해당 파일 () 모든 것이 예상대로 작동합니다!

해결법

  1. ==============================

    1.$ {...}은 Spring의 "Spring EL"이 아닙니다. 속성 자리 표시 자입니다.

    $ {...}은 Spring의 "Spring EL"이 아닙니다. 속성 자리 표시 자입니다.

    나는 당신이 Spring "Property Placeholders"와 logback "variables"를 혼동하고 있다고 생각합니다.

    그들은 단지 $ {...} 같은 구문을 사용합니다.

    logback은 Spring 속성 자리 표시 자 메커니즘에 대해 아무것도 모르고 그 반대도 마찬가지입니다. 엄격하게 Spring (부팅) 개념 인 application.properties / application.yml이 아니라 로그백 문서에 따라 로그백 변수를 구성해야합니다.

    편집하다:

    logback 문서를 간략하게 살펴본 후

    <property resource="application.properties" />
    

    logback.xml이 작동해야합니다.

  2. ==============================

    2.Spring Boot 1.3 이후부터는 logback-spring.xml 설정에서 Spring 속성을 얻는 더 좋은 방법이있다.

    Spring Boot 1.3 이후부터는 logback-spring.xml 설정에서 Spring 속성을 얻는 더 좋은 방법이있다.

    이제 "springProperty"요소를 추가 할 수 있습니다.

    <springProperty name="destination" source="my.loggger.extradest"/>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${destination}</file>
            ...
        </file>
    </appender>
    

    https://github.com/spring-projects/spring-boot/commit/055ace37f006120b0006956b03c7f358d5f3729f

    편집 : Anders에게 감사드립니다.

    .........

  3. ==============================

    3.위에서 응답 한대로 요소를 사용하여 스프링 부트 속성에 액세스 할 수 있지만, 로그백 구성 파일의 이름은 logback-spring.xml이어야하며, 이름을 지정하면 작동하지 않습니다. file logback.xml (스프링 부트 1.3.5.RELEASE 사용)

    위에서 응답 한대로 요소를 사용하여 스프링 부트 속성에 액세스 할 수 있지만, 로그백 구성 파일의 이름은 logback-spring.xml이어야하며, 이름을 지정하면 작동하지 않습니다. file logback.xml (스프링 부트 1.3.5.RELEASE 사용)

  4. ==============================

    4.위의 솔루션은 주로 bootrap.properties에서 작동합니다. 그러나, 현재 발견 된 logback 설정에서 원격 Spring Config Server의 속성을 사용하는 유일한 방법은 프로그램 적으로 적용하는 것입니다.

    위의 솔루션은 주로 bootrap.properties에서 작동합니다. 그러나, 현재 발견 된 logback 설정에서 원격 Spring Config Server의 속성을 사용하는 유일한 방법은 프로그램 적으로 적용하는 것입니다.

    @Component
    public class LoggerConfiguration implements ApplicationListener<EnvironmentChangeEvent> {
    
        @Autowired protected Environment environment;
    
        @Override
        public void onApplicationEvent(EnvironmentChangeEvent event) {
            // enviroment here has already loaded all properties and you may alter logback config programatically
            ch.qos.logback.classic.Logger rootLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
        }
    
    
    }
    

    이런 식으로 새로운 appender로 logback을 커스터마이징하는 좋은 예가 있습니다.

  5. from https://stackoverflow.com/questions/29322709/unable-to-use-spring-property-placeholders-in-logback-xml by cc-by-sa and MIT license