programing

log4j2.xml의 스프링 부팅 애플리케이션 속성 사용

i4 2023. 7. 5. 20:04
반응형

log4j2.xml의 스프링 부팅 애플리케이션 속성 사용

저는 spring boot 기반의 웹 애플리케이션을 개발하고 있으며 log4j2를 로거 구현으로 사용하고 싶습니다.
log4j2-spring.xml 파일에 정의된 로깅 구성을 사용하면 모든 것이 정상적으로 작동합니다.

작동하지 않는 것:log4j2-spring.xml 파일에서 봄 부팅을 구성하는 데 사용되는 application.yml 파일에 정의된 속성에서 확인해야 하는 속성 자리 표시자를 사용하려고 합니다.

이것이 가능합니까?만약 그렇다면, 어떻게?

속성의 직접 대체log4j2-spring.xml속성 자리 표시자를 통해 사용할 수 없습니다.log4j2-spring.xmlSpring의 범위 밖에 있으며 구성 목적으로만 사용됩니다.

그러나 다음과 같은 이점을 활용할 수 있습니다.Log4j2여기에 설명된 속성 대체의 즉시 사용 가능한 기능.

1단계 - 속성 이름 및 해당 변수 지정log4j2-spring.xml하기와 같이

<Configuration status="warn">
    <Properties>
        <Property name="someProp">${bundle:test:someKey}</Property>
    </Properties> 
    <!--other configs -->
</Configuration>

2단계 - 로그 구성에서 위에 정의된 속성(예: 파일 이름을 로그하는 접미사)을 사용합니다.

<Appenders>
    <File name="file" fileName="/path/to/logs/app-${someProp}.log">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %-40c{1.} - %m%n"/>
    </File>
</Appenders>

3단계 - 속성 값(예: test.properties)을 유지할 번들(viz properties 파일)을 만듭니다.

# properties for log4j2
someKey=someValue
someKey1=someValue1

이 파일에는 log4j2 구성에서 사용하려는 yaml 단위의 값이 포함됩니다.이러한 속성이 애플리케이션에서도 사용되는 경우 yaml 및 번들(즉, 속성 파일)에 중복됩니다. 이 번들은 스프링이 log4j2 구성에 주입할 수 없기 때문에 허용 가능한 타협이어야 합니다.

더 많은 정보가 필요한 경우 코멘트로 알려주시기 바랍니다.

log4j xml 구성에 Spring Boot YAML 속성을 주입하는 것과 유사한 문제에 직면한 적이 있으며, Spring Boot 1.5.X(아마도 2.0, 테스트하지는 않았지만)에 대한 솔루션을 찾았습니다. 이 솔루션은 시스템 속성 검색에서 작동합니다.

응용 프로그램에 프로필 "dev"가 있고 주입할 속성이 있다고 가정하면 응용 프로그램-dev.yml은 다음과 같습니다.

property:
    toInject: someValue

xml 구성 log4j2-spring-dev.xml에서 다음과 같은 내용을 입력합니다.

<Properties>
    <property name="someProp">${sys:property.toInject}</property>
</Properties>

이제 어떻게든 이 스프링 속성을 시스템 속성으로 전송해야 합니다.애플리케이션 환경이 준비되고 로깅 시스템이 초기화되기 전에 이 작업을 수행해야 합니다.Spring Boot에는 전체 로깅 시스템을 초기화하는 수신기 LoggingApplicationListener가 있습니다. 이 수신기는 ApplicationEnvironmentPreparedEvent 이벤트에 의해 트리거되므로 LoggingApplicationListener보다 우선 순위가 높은 수신기를 생성합니다.

public class LoggingListener implements ApplicationListener, Ordered {

@Override
public int getOrder() {
    return LoggingApplicationListener.DEFAULT_ORDER - 1;
}

@Override
public void onApplicationEvent(ApplicationEvent event) {
    if (event instanceof ApplicationEnvironmentPreparedEvent) {
        ConfigurableEnvironment environment = ((ApplicationEnvironmentPreparedEvent) event).getEnvironment();
        List<String> activeProfiles = Arrays.asList(environment.getActiveProfiles());
        if (!activeProfiles.contains("dev")) {
            return;
        }

        String someProp = environment.getProperty("property.toInject")
        validateProperty(someProp);

        System.setProperty("property.toInject", someProp);
    }
}

이제 이 수신기를 프로그램에 등록합니다.

public static void main(String[] args) {
    SpringApplication application = new SpringApplication(MyApplication.class);
    application.addListeners(new LoggingListener());
    application.run(args);
}

그리고 이것이 마지막입니다.스프링 부트 속성은 log4j2 구성 파일에 "주입"되어야 합니다.이 솔루션은 클래스 경로 속성 및 --spring.config.location 속성과 함께 작동합니다.Spring Cloud Config와 같은 일부 외부 구성 시스템에서는 작동하지 않습니다.

도움이 되길 바랍니다.

mvn을 사용하는 경우 mvn 리소스 플러그인을 사용할 수 있습니다.이를 통해 빌드 시간 내에 목표를 달성할 수 있습니다.

링크: https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html

언급URL : https://stackoverflow.com/questions/48941104/use-spring-boot-application-properties-in-log4j2-xml

반응형