繁体   English   中英

log4j2设置Async Logger和Async Appender的线程数

[英]log4j2 Set number of threads for Async Logger and 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>

根据设计,Async Loggers和AsyncAppender只有一个执行I / O的线程。 它们都是异步的,因此您的应用程序对Logger.debug(...)的调用会立即返回。

异步记录器与AsyncAppender的不同之处在于Async Loggers使用非阻塞数据结构(LMAX Disruptor)将日志事件排入队列。 当您的应用程序有许多同时记录的线程时,这种优势就会随之而来。 非阻塞队列意味着您的应用程序线程不需要争用锁定,从而提供更好的吞吐量和更低/更可预测的延迟。

然后,后台线程将日志事件从队列中取出并批量写入I / O设备,这非常有效。

因为只有一个后台线程,所以此线程也不需要与其他线程竞争I / O设备上的锁,再次提供更好的性能。

日志中的时间戳是应用程序线程创建事件时的时间戳,与事件实际写入磁盘的时间不同。

如何证明日志记录是异步的? 您可以在调试器中运行您的应用程序; 您应该看到应用程序的一个线程和AsyncLoggerConfig的一个线程。 如果在IDE中暂停AsyncLogger线程,则不会将更多事件写入磁盘,但您的应用程序线程仍将继续调用Logger.log,这证明日志记录是异步的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM