2016-12-07 2 views
0

비동기 애플릿에 bufferSize="512"이 있습니다.log4j2 : 비동기 애플릿에 대한 로거 버퍼 플러시

일부 상황에서는 강제로 버퍼를 플러시해야합니다. 어떻게해야합니까?

LogManager를 닫아야 할 대상이 없으므로 LogManager.shutdown();은 옵션이 아닙니다.

도와주세요!

업데이트

:

<Kafka name="Kafka" topic="logs-gexd-default"> 
    <PatternLayout> 
     <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5p %C{1}:%L - %m%n</pattern> 
    </PatternLayout> 
    <Property name="bootstrap.servers">${kafkaAddress}</Property> 
</Kafka> 
<Async name="AsyncKafka" bufferSize="512" blocking="false"> 
    <AppenderRef ref="Kafka"/> 
</Async> 

내가 비동기 펜더의 내부 카프카의 펜더가 : 여기 내 log4j2.xml의 일부입니다. 불행히도 Kafka appender는 비동기 appender가 아니라 immediateFlush 필드를가집니다.

답변

0

This answer이 문제를 해결할 수도 있습니다 ... 특정 피쳐를 모두 내 보내지 않고 찾아야합니다. 그래도 플러시 메시지가 바람직하지 않을 수 있습니다.

이 기술을 사용하면 주어진 메시지를 쓰고 즉시 플러시 한 다음 향후 메시지에 setImmediateFlush (false) 메서드를 호출 할 수 있습니다.

+0

질문이 업데이트되었습니다. –

+0

Async appender의 경우 https://logging.apache.org/log4j/2.x/manual/async.html을 확인하십시오. "비동기 Appender는 배치가 끝날 때 (대기열이 비어있는 경우) 디스크로 플러시되도록 향상되었습니다. 즉,"immediateFlush = true "를 구성하는 것과 동일한 결과를 생성합니다. 즉, 수신 된 모든 로그 이벤트를 항상 디스크" . 그것은 당신이 찾고있는 것이 아니지만, 당신이 더 잘할 수 있다고 생각하지 않습니다. Kafka에 관해서, 나는 확실하지 않다. ... – Igor

1

AsyncAppender에서 사용하는 버퍼에는 플러시 개념이 없습니다. 이 버퍼의 이벤트는 아직 처리되지 않았으므로 플러시 할 수 없습니다. 대기열에서 이벤트가 제거되는 속도는 기본 Appenders에 따라 다릅니다.

을 삭제 하시겠습니까? 모든 이벤트가 현재 대기열에 있습니까? 그렇다면 유스 케이스에 대해 자세히 설명해 주시겠습니까? 댓글 후


업데이트 (응용 프로그램은 단순히 ... 그래서 대기 이벤트를 폐기하는 것이 유용 할 것이다 볼 수 없습니다 큐에 더 많은 LOGEVENTS 추가됩니다) :

내가 대신 다시 구성하는 것이 좋습니다 것입니다 일부 Appenders를 중지하면서 다른 Appender를 계속 실행합니다. monitorInterval이 설정되어있는 경우 구성 파일을 변경하여 중지 할 Appender를 제거 할 수 있습니다. 재구성 프로세스의 일부로 Log4j2는 Appenders가 중지되기 전에 Async Appender에 대기중인 로그 이벤트가 완전히 처리되도록합니다.

+0

나는 어느 순간 appender를 멈출 필요가있다. 내가 만들었을 때 로거가 마지막 버퍼에서 데이터를 보내지 못했습니다. 그래서 멈추기 전에 그것을 내뿜고 싶습니다. –

+0

어떻게 appender를 중지 했습니까? 또한 어 펜더를 중지하고 LogManager를 닫지 않아야하는 이유는 무엇입니까? –

+0

카프카와 비동기 애펜더에는'.stop()'메서드가 있습니다. 다른 애펜더가 실행 중이므로 LogManager를 닫고 싶지 않습니다. 그리고 나는 그들을 멈추고 싶지 않다. –