2014-06-17 4 views
3

log4j2에서 Async Logger 및 Async Appender 스레드 수를 어떻게 설정합니까? 그것은 기본적으로 하나의 스레드를 사용하고 있습니까?log4j2 Async Logger 및 Async Appender 스레드 수 설정

100,000 레코드의 배치에 대해 실행 해 보았습니다. system.out.print를 사용하여 표시된 마지막 로그 명령문 시간 및 종료 타임 스탬프의 차이가 표시되지 않습니다. 비동기 로깅을 어떻게 증명할 수 있습니까?

<RollingFile name="APP.ALERT" fileName="C:\Users\sbasheer\Downloads\abc\Alert.log" 
filePattern="C:\Users\sbasheer\Downloads\abc\Alert%d{MM-dd-yyyy}-%i.log" immediateFlush="true" append="true"> 
    <PatternLayout> 
    <Pattern>%d %p %class{1.} [%t] %location %m %ex%n</Pattern> 
    </PatternLayout> 
    <Policies> 
    <TimeBasedTriggeringPolicy /> 
    <SizeBasedTriggeringPolicy size="25 MB"/> 
    </Policies> 
    <DefaultRolloverStrategy max="50"/> 
</RollingFile> 


<AsyncLogger name="com.abc.asyncsample" level="trace" includeLocation="true" additivity="true"> 
    <AppenderRef ref="APP.ALERT" level="error" /> 
</AsyncLogger> 

답변

2

비동기 로거와 AsyncAppender는 모두 I/O를 수행하는 스레드가 하나뿐입니다. 둘 다 비동기식이므로 응용 프로그램에서 Logger.debug (...)를 호출하면 즉시 반환됩니다.

비동기 로거는 비동기 로거가 비 차단 데이터 구조 (LMAX Disruptor)를 사용하여 로그 이벤트를 큐에 넣는다는 점에서 AsyncAppender와 다릅니다. 이 기능은 응용 프로그램이 동시에 로깅하는 스레드가 많은 경우에 유용합니다. 논 블로킹 큐는 응용 프로그램 스레드가 잠금을 위해 경합 할 필요가 없으므로 훨씬 우수한 처리량과 예측 가능한 대기 시간을 제공합니다.

그런 다음 백그라운드 스레드는 로그 이벤트를 대기열에서 제거하여 일괄 적으로 I/O 장치에 씁니다. 이는 매우 효율적입니다.

배경 스레드가 하나뿐이기 때문에이 스레드는 I/O 장치의 잠금을 위해 다른 스레드와 경쟁 할 필요가 없으므로 성능이 향상됩니다.

로그의 타임 스탬프는 응용 프로그램 스레드에서 이벤트를 만들 때 사용한 타임 스탬프이며 이벤트가 실제로 디스크에 기록되는 시간과 다릅니다.

로깅이 비동기임을 증명하는 방법은 무엇입니까? 디버거에서 응용 프로그램을 실행할 수 있습니다. 응용 프로그램에 대한 하나의 스레드와 AsyncLoggerConfig에 대한 하나의 스레드가 표시되어야합니다. IDE에서 AsyncLogger 스레드를 일시 중지하면 더 이상 이벤트가 디스크에 기록되지 않지만 응용 프로그램 스레드는 여전히 Logger.log를 계속 호출하므로 로깅이 비동기임을 나타냅니다.

+0

감사합니다. Remko. 그래서 내 응용 프로그램에서 30 스레드가 있으면 비 블록 데이터 구조에서 읽기 AsyncLoggerConfig에 대한 하나의 스레드가있을 것입니다? 로깅을위한 백그라운드 스레드 수를 늘릴 수있는 옵션이 있습니까? 아니면 하나의 단일 스레드가 충분히 확장되어 있습니까? – Sibish

+0

예, 대기열에서 읽는 스레드는 하나뿐입니다. 앱은 원하는만큼의 스레드를 가질 수 있습니다. 아니요, 백그라운드 스레드 수를 늘릴 수있는 옵션이 없습니다. (단일 스레드는 IO 디바이스의 잠금을 위해 다른 스레드와 경쟁 할 필요가 없으므로 확장 성이 좋습니다.) –