1. AsyncAppender의 buffer가 full나면, 로그 요청 thread에서 blocking 발생
-> 자식 appender들이 buffer에 쌓인 로그 이벤트를 처리하여 buffer가 비워질때까지 blocking 유지...
-> full-GC와 유사한 상황이 발생하게 됨
(buffer 비우는 동안, 로그가 쌓이고 비워진 buffer가 순식간에 다시 full 되면서 "buffer 비우기 -> (blocking) -> buffer 비우기"가 반복됨)
2. 일반적으로 AsyncAppender는 remote logging시 성능향상을 가져오며, local logging시는 오히려 성능을 저하시킴 (buffering overhead로 인해...)
3. blocking을 하지 않는 옵션이 있으나, log4j 라이브러리 업데이트 필요
-> setBlocking(false) 설정 가능, 기본 값은 true로 설정되어 있음.
-> log4j.1.2.14 이후 버전에서 적용 가능
4. Log4j 로깅성능 향상을 위한 다른 방안
-> WriterAppender.setImmediateFlush(false), 기본값은 true임
. false 설정 시, 로깅 성능이 10 ~ 20% 정도 향상됨. (출처 : API 문서)
. false 설정 시, application 종료 시, 마지막 몇 줄의 log가 disk에 기록되지 않을 수 있음 (trade-off)
-> FileAppender.serBufferedIO(true), 기본값은 false임
. 로깅 부하가 높은 시스템에서 성능 향상 폭이 큼 (출처 : API 문서)
5. 예시
6. 참고자료
5. 예시
<appender name="BUFFERED_APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="C:/Logs/myApp.log" />
<param name="Append" value="true" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="ImmediateFlush" value="false"/>
<param name="BufferedIO" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d] %-5p %C{3}.%M(%13F:%L) %3x - %m%n" />
</layout>
</appender> 6. 참고자료
- http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/AsyncAppender.html#setBlocking(boolean)
- http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/WriterAppender.html#setImmediateFlush(boolean)
- http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/FileAppender.html#setBufferedIO(boolean)
- https://issues.apache.org/bugzilla/show_bug.cgi?id=38982
- http://glueclue.blogspot.com/2007/01/log4j-asyncappender-is-not-always_31.html
- http://fredpuls.com/site/softwaredevelopment/java/log4j/log4j_performance_tips.htm
