springboot 2.x 통합 log4j 2 디 버 깅 로그 가 닫 힐 수 없 는 문 제 를 해결 합 니 다.

springboot2.x 통합 로그 4j 2 시 로그 출력 을 닫 을 수 없습니다.
다음 설정 을 했 습 니 다:
log4j2.xml 설정 파일 에서 configuration 의 status 속성 을 OFF 로 설정 합 니 다.
시스템 의 모든 곳 에 log4j 2.debug 가 설정 되 어 있 지 않 은 지 확인 하기;
위 설정 도 문 제 를 해결 할 수 없 으 니 소스 코드 부터 탐구 할 수 밖 에 없다.
log4j2-api 패키지 에서 StatusLogger 를 찾 았 습 니 다.로그 출력 level 을 설정 하 는 코드 는 다음 과 같 습 니 다.

private StatusLogger(final String name,final MessageFactory messageFactory) {
        super(name, messageFactory);
        final String dateFormat = PROPS.getStringProperty(STATUS_DATE_FORMAT, Strings.EMPTY);
        final boolean showDateTime = !Strings.isEmpty(dateFormat);
        this.logger =new SimpleLogger("StatusLogger", Level.ERROR,false,true, showDateTime,false,
                dateFormat, messageFactory, PROPS, System.err);
        this.listenersLevel = Level.toLevel(DEFAULT_STATUS_LEVEL, Level.WARN).intLevel();
 
        // LOG4J2-1813 if system property "log4j2.debug" is defined, print all status logging
        if (isDebugPropertyEnabled()) {
            logger.setLevel(Level.TRACE);
        }
    }
위 코드 에서 알 수 있 듯 이 level 의 단 계 는 기본적으로 error 로 설정 되 어 있 으 며,log4j 2.debug 를 설정 할 때 만 trace 로 그 를 출력 합 니 다.
그럼 log4j 2.debug 속성 은 어디 에 설정 되 어 있 습 니까?이 문 제 를 가지 고 System Properties Property Source 를 찾 았 습 니 다.이 종 류 는 Environment 에 속성 을 불 러 오기 전에 사용자 정의 처 리 를 합 니 다.

private static final String PREFIX ="log4j2.";
 
@Override
public CharSequence getNormalForm(final Iterable<?extends CharSequence> tokens) {
    return PREFIX + Util.joinAsCamelCase(tokens);
}
상기 코드 에서 보 듯 이 이 조작 은 모든 시스템 속성 을 설명 한 다음 에 분 석 된 token 에 따라 로그 4j 2 의 접 두 사 를 추가 합 니 다.로그 시스템 이 debug 가 필요 하 다 고 생각 하여 trace 로 그 를 출력 하 는 문제 가 발생 했 습 니 다.
그럼 시스템 속성 에 있 는 debug 는 어디서 났 어 요?
우선,로 컬 프로 세 스 는 run 모드 로 시작 되 었 고 환경 변수 도 debug 인 자 를 자체 적 으로 설정 하지 않 았 습 니 다.왜 jvm 시작 매개 변수 에'-Debug'가 존재 합 니까?
실행 중인 프로 세 스 의 Configurations 설정 을 보 려 면 다음 과 같 습 니 다.

springboot 에 사용자 정의 설정 이 있 습 니 다.기본 값 은 enable debug output 입 니 다.이것 을 지우 고 다시 실행 하 니-Debug 가 없어 졌 고 로그 도 정상 입 니 다.
그럼 에 도 불구 하고 log4j 2 는 지능 장애 가 있 지 않 습 니까?이렇게 시스템 변 수 를 연결 하 는 방법 은 헷 갈 리 기 쉽 습 니 다.
springboot 통합 log4j 2 가 만난 구덩이
프로젝트 에 springboot 를 사용 하려 면 로그 프레임 워 크 를 사용 해 야 합 니 다.
문제.
프로젝트 시작 오류:classpath:log4j2-dev.yml 에서 Log4J 2 로 깅 을 초기 화 할 수 없습니다.

Log4J 2 설정 을 초기 화 할 수 없 는 문제 입 니 다.프로젝트 에 사 용 된 yml 설정 파일 입 니 다.
선행 조작
우선 의존 도입:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
기본 logback 설정 지우 기:

    <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>
프로필 추가:
1040577-20180626113432305-938644465.png
logging.config 설정
1040577-20180626113453767-2008327927.png
이상 은 통합 작업 에 필요 한 설정 입 니 다.시작 오류 가 발생 했 습 니 다.
문제 조사
이상 정보 설명 에 따라 원본 코드 에서 초기 화 된 코드 를 찾 습 니 다:Log4J2LoggingSystem.loadConfiguration
1040577-20180626113603596-370754945.png
계속 따라 가기:
1040577-20180626113633878-1356429116.png
발견 은 추상 적 인 방법 입 니 다.아이디어 에서 ctrl+alt+B 를 사용 하여 실현 클래스 를 찾 습 니 다.
1040577-20180626113653590-402312615.png
yml 을 사 용 했 기 때문에 실현 클래스 는 YamlConfig 이 어야 합 니 다.구체 적 인 실현 을 찾 으 십시오.
1040577-20180626113734764-411601003.png
debug 를 통 해 isActive 가 false 인 것 을 발 견 했 기 때문에 null 로 돌아 갑 니 다.이 중에서 isActive 의 의 미 를 찾 습 니 다:
1040577-20180626113809127-180360783.png
이것 은 관건 적 인 논리 이다.원래 돌아 가서 위의 몇 가지 의존 클래스 가 있 는 지 확인 하고 디 버 깅 은 YAMFactory 와 같은 종류 가 없다.이 종 류 는 잭 슨 가방 에 있 는 것 으로 보 이 며 가방 에 덜 의존 한 것 으로 보인다.
해결 하 다.
jackson-dataformat-yaml 의존 도입:

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-yaml</artifactId>
    </dependency>
정상적으로 작 동 하여 문제 가 해결 되다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기