log4j2.xml의 스프링 부팅 애플리케이션 속성 사용
저는 spring boot 기반의 웹 애플리케이션을 개발하고 있으며 log4j2를 로거 구현으로 사용하고 싶습니다.
log4j2-spring.xml 파일에 정의된 로깅 구성을 사용하면 모든 것이 정상적으로 작동합니다.
작동하지 않는 것:log4j2-spring.xml 파일에서 봄 부팅을 구성하는 데 사용되는 application.yml 파일에 정의된 속성에서 확인해야 하는 속성 자리 표시자를 사용하려고 합니다.
이것이 가능합니까?만약 그렇다면, 어떻게?
속성의 직접 대체log4j2-spring.xml
속성 자리 표시자를 통해 사용할 수 없습니다.log4j2-spring.xml
Spring의 범위 밖에 있으며 구성 목적으로만 사용됩니다.
그러나 다음과 같은 이점을 활용할 수 있습니다.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
'programing' 카테고리의 다른 글
MongoDB에서 인덱스를 다시 작성해야 하는 이유와 시기는 무엇입니까? (0) | 2023.07.05 |
---|---|
객체 지향 설계 워크북(객체 모델 도메인, 시스템 시퀀스 다이어그램, 상호 작용 다이어그램) (0) | 2023.07.05 |
'*' 연산자 없이 곱셈을 수행하려면 어떻게 해야 합니까? (0) | 2023.07.05 |
새로운 iOS7 SDK로 보기 위에 탐색 모음이 나타납니다. (0) | 2023.07.05 |
주 클래스 Spring-Boot 명령줄 지정 (0) | 2023.07.05 |