2017-11-02 3 views
1

log4j2 버전을 지원하지 않습니다 2.9.1log4j2 asyncLogger 사용자 정의 스럽 큐 전체 정책을

스럽 큐가 가득 차면, checkrollover 차단 많은 스레드가 발생하거나 방법 - 파일 쓸 수있는 기본으로 CurrentThread에서의 Appender를 호출 log4j2

. 이 문제를 해결하려면, 내가 예를 들어, 사용자 정의에 log4j2의 AsyncQueueFullPolicy을 추구하십시오 CurrentThread 번호가 100 이상이면, 로그

그러나 유일한 방법을 폐기 org.apache.logging.log4j.core.async.AsyncQueueFullPolicy.getRoute(long, Level) 반환 EnumENQUEUE | SYNCHRONOUS | DISCARD .IN 자바, 열거를 지원 유형 EventRoute, 유형이 지원되지 않습니다.

어떻게 AsyncQueueFullPolicy를 사용자 정의 할 수 있습니까? 예를 들어주세요. 감사합니다.

답변

0

사용자 정의 AsyncQueueFullPolicy을 지정할 수 있습니다. 클래스는 AsyncQueueFullPolicy 인터페이스를 구현해야하며 시스템 등록 정보 log4j2.AsyncQueueFullPolicy을 AsyncQueueFullPolicy 구현 클래스의 정규화 된 클래스 이름으로 설정하여 응용 프로그램을 시작하여 install 인터페이스를 구현해야합니다.

대기열이 가득 차면 구현 클래스가 각 이벤트에 대해 으로 지정되어 이벤트 처리 방법을 결정합니다. 큐가 가득 차지 않은 경우 구현 클래스는 이 아니며이 호출됩니다. 각 이벤트의 경우, 구현 클래스는 여부에

  • DISCARD이 이벤트 (이 기록에 남지 않습니다)
  • ENQUEUE이 이벤트 (공간이 큐에 사용할 수있을 때까지이 차단됩니다)
  • 동기식를 결정해야 : 대기열을 건너 뛰고이 이벤트를 기본 appender에 직접 기록하십시오. 이렇게하면 이벤트가 로그 파일에 잘못 표시됩니다!

다음은 정책에서 사용할 수있는 유일한 옵션입니다. 추가 옵션을 제안하려면 Log4j2 issue tracker에서 티켓을 준비하십시오.

는 아마도 내가 질문을 오해하고있어,하지만 스레드 ID가 100보다 큰는 다음과 같이 할 수있을 때 사용자 지정 정책은 이벤트를 삭제 :

public class CustomQueueFullPolicy extends DefaultAsyncQueueFullPolicy { 
    public CustomQueueFullPolicy() { 
    } 

    @Override 
    public EventRoute getRoute(final long backgroundThreadId, final Level level) { 
     if (backgroundThreadId > 100) { 
      return EventRoute.DISCARD; 
     } 
     return super.getRoute(backgroundThreadId, level); 
    } 
} 

(Log4j2의 DefaultAsyncQueueFullPolicy의 구현이 변경된다는 점에 유의 자세한 내용은 LOG4J2-2031을 참조하십시오.

대기열이 가득 차면 레벨이 특정 임계 값 아래로 떨어지는 로그 이벤트를 삭제하는 정책의 예는 DiscardingAsyncQueueFullPolicy을 참조하십시오.

+0

감사합니다. 이미 [이슈] (https://issues.apache.org/jira/browse/LOG4J2-2095)를 저지르고 있습니다. 예상치 못한 버전이이를 수정하거나 우회 해결책을 제공 할 것입니다. – user3851947

+0

좋습니다, 그럼 논의 해 봅시다. 그 표를 ​​더 보자. 도움이 되었다면 제 답변을 수락하십시오. –