springboot 학습 시리즈 : log4j2 로깅 프레임 워크를 사용하여 스프링 변수를 기반으로 로그 파일을 동적으로 생성

장면

이전 프로젝트는 마이크로 서비스 프레임 워크 로 전환되었으며 이전 프로젝트의 로그 프레임 워크와 호환되기 위해 log4j2 프레임 워크가 사용되었습니다. 로 전환 한 후 log4j2의 프레임 워크, 로그 구성은 매우 다르다 원래 logback의 로그 구성 및 환경 변수를 읽은 다음 변수를 변환 할 수있는 방법은 없습니다. 이 기사는 주로이 상황을 해결하기위한 것입니다.

주위

소프트웨어 버전
봄 부츠 2.1.1. 릴리스

본문

원래 이해

다음과 같이 프로젝트에서 사용 된 log4j2.xml 파일 내용 을 보여 드리겠습니다 .

<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <property  name="springAppName" value="${spring:spring.application.name}" />
        <property  name="springAppPort" value="${spring:server.port}" />
        <property name="LOG_INFO_FILE" value="${BUILD_FOLDER:-logs}/${springAppName}-${springAppPort}.log" />
        <property name="CONSOLE_LOG_PATTERN" value="[%p] %d{yyyy-MM-dd HH:mm:ss S} - %m%n" />
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                    pattern="${CONSOLE_LOG_PATTERN}"/>
        </Console>
        <RollingRandomAccessFile name="infoLog" fileName="${LOG_INFO_FILE}"
                                 filePattern="${LOG_INFO_FILE}.%d{yyyy-MM-dd}.gz"
                                 append="true">
            <PatternLayout
                    pattern="${CONSOLE_LOG_PATTERN}"/>
            <Filters>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
            </Filters>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="30 MB"/>
            </Policies>
        </RollingRandomAccessFile>
    </Appenders>
    <Loggers>
        <!-- root logger -->
        <Root level="info" includeLocation="true">
            <AppenderRef ref="infoLog"/>
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

여기서 변수는 속성 태그를 사용하여 설정 됩니다 . log4j의 기본 레이블 접두사는 다음과 같습니다. 자세한
여기에 사진 설명 삽입
내용은 아래 참조 링크를 참조하여 직접 확인하십시오. Log4j 는 더 많은 플러그인을 제공하며 구성 파일에 따라 동적으로 데이터를 읽을 수도 있습니다. 하지만 여기에있는 프로젝트 springcloud 프로젝트이며 구성 정보는 구성 센터에 저장됩니다. 구성 센터의 구성에 따라 동적으로 읽을 수 있기를 바랍니다.

소스 코드 표시

다음으로 프로젝트에 사용 된 소스 코드를 보여 드리겠습니다.

@Plugin(name = "spring", category = StrLookup.CATEGORY)
public class SpringEnvrionmentLookup extends AbstractLookup
        implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    
    

    private static ConfigurableApplicationContext context;


    @Override
    public String lookup(final LogEvent event, final String key) {
    
    
        if (context != null) {
    
    
            return context.getEnvironment().getProperty(key);
        }
        return null;
    }


    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
    
    
        context = configurableApplicationContext;
    }
}

또한이를 사용하기 위해서는 resource 디렉토리 아래에 새로운 META-INF / spring.factories를 생성해야하며, 내용은 다음과 같습니다.

org.springframework.context.ApplicationContextInitializer=SpringEnvrionmentLookup

구성 센터에 해당하는 시스템 구성 테이블에서 해당하는 logging.configclasspath : log4j2.xml구성 하십시오 . 그렇지 않으면 기본 logback.xml 파일 을 읽을 수 있으며 로그 생성 실패 문제가 발생할 수 있습니다.

결과

프로젝트가 시작되면 콘솔에서 오류 보고서를 볼 수 있습니다. 하지만 플러그인의 스프링 환경 변수가 주입되지 않았기 때문에 얻은 ​​값이 비어 있고 오류가보고됩니다. 그러나 구성 센터에서 구성 데이터를 가져 오기를 기다린 후 정상적으로 실행할 수 있습니다. 생성 된 로그를 직접 보면 그러한 오류가 없습니다. 로그의 시작은 다음과 같습니다.
여기에 사진 설명 삽입

요약하자면

나는 인터넷에서 많은 문서를 확인했고 내가 쓴 내용이 다소 문제가 있었기 때문에 효과적인 해결책을 제공하기를 희망하면서이 블로그를 직접 작성했습니다! ! !

참조 링크

공식 문서 구성 공식 문서 조회

칭찬 요청

내 글이 모든 사람에게 도움이되는 경우, 문서의 하단에 좋아하는 나처럼 클릭 할 수 있습니다,
좋은 토론이있는 경우, 당신은 메시지를 남길 수 있습니다
당신은 내 미래의 문서를 보려면 계속하려는 경우, 당신은 후속 클릭 할 수 있습니다
당신을 다음 QR 코드를 스캔하여 'S 공개 계정 : Fengye Zhixuege, 내 최신 공유를 확인하세요!
여기에 사진 설명 삽입
안녕

추천

출처blog.csdn.net/u013084266/article/details/108818441