springboot 2.x 통합 log4j 2 디 버 깅 로그 가 닫 힐 수 없 는 문 제 를 해결 합 니 다.
5369 단어 springbootlog4j2로그
다음 설정 을 했 습 니 다:
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>
프로필 추가:logging.config 설정
이상 은 통합 작업 에 필요 한 설정 입 니 다.시작 오류 가 발생 했 습 니 다.
문제 조사
이상 정보 설명 에 따라 원본 코드 에서 초기 화 된 코드 를 찾 습 니 다:Log4J2LoggingSystem.loadConfiguration
계속 따라 가기:
발견 은 추상 적 인 방법 입 니 다.아이디어 에서 ctrl+alt+B 를 사용 하여 실현 클래스 를 찾 습 니 다.
yml 을 사 용 했 기 때문에 실현 클래스 는 YamlConfig 이 어야 합 니 다.구체 적 인 실현 을 찾 으 십시오.
debug 를 통 해 isActive 가 false 인 것 을 발 견 했 기 때문에 null 로 돌아 갑 니 다.이 중에서 isActive 의 의 미 를 찾 습 니 다:
이것 은 관건 적 인 논리 이다.원래 돌아 가서 위의 몇 가지 의존 클래스 가 있 는 지 확인 하고 디 버 깅 은 YAMFactory 와 같은 종류 가 없다.이 종 류 는 잭 슨 가방 에 있 는 것 으로 보 이 며 가방 에 덜 의존 한 것 으로 보인다.
해결 하 다.
jackson-dataformat-yaml 의존 도입:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
정상적으로 작 동 하여 문제 가 해결 되다.이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin Springboot -- 파트 14 사용 사례 REST로 전환하여 POST로 JSON으로 전환前回 前回 前回 記事 の は は で で で で で で を 使っ 使っ 使っ て て て て て リクエスト を を 受け取り 、 reqeustbody で 、 その リクエスト の ボディ ボディ を を 受け取り 、 関数 内部 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.