如何在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>
答案 0 :(得分:3)
根据设计,Async Loggers和AsyncAppender只有一个执行I / O的线程。它们都是异步的,因此应用程序对Logger.debug(...)的调用会立即返回。
Async Logger与AsyncAppender的不同之处在于Async Loggers使用非阻塞数据结构(LMAX Disruptor)将日志事件排入队列。当您的应用程序有许多同时记录的线程时,这种优势就会随之而来。非阻塞队列意味着您的应用程序线程不需要争用锁定,从而提供更好的吞吐量和更低/更可预测的延迟。
后台线程然后将日志事件从队列中取出并批量写入I / O设备,这非常有效。
因为只有一个后台线程,所以此线程也不需要与其他线程竞争I / O设备上的锁定,再次提供更好的性能。
日志中的时间戳是应用程序线程创建事件时的时间戳,与事件实际写入磁盘的时间不同。
如何证明日志记录是异步的?您可以在调试器中运行您的应用程序;您应该看到应用程序的一个线程和AsyncLoggerConfig的一个线程。如果在IDE中暂停AsyncLogger线程,则不会有更多事件写入磁盘,但您的应用程序线程仍将继续调用Logger.log,这证明日志记录是异步的。