Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java log4j2设置异步记录器和异步追加器的线程数_Java_Logging_Configuration_Log4j_Log4j2 - Fatal编程技术网

Java log4j2设置异步记录器和异步追加器的线程数

Java log4j2设置异步记录器和异步追加器的线程数,java,logging,configuration,log4j,log4j2,Java,Logging,Configuration,Log4j,Log4j2,如何在log4j2中设置异步记录器和异步追加器的线程数?它默认使用一个线程吗 我试着运行一批100000条记录,在使用system.out.print显示的最后日志语句时间和应用程序退出的结束时间戳中没有发现任何差异。如何证明这是异步日志记录 <RollingFile name="APP.ALERT" fileName="C:\Users\sbasheer\Downloads\abc\Alert.log" filePattern="C:\Users\sbasheer\Downloads

如何在log4j2中设置异步记录器和异步追加器的线程数?它默认使用一个线程吗

我试着运行一批100000条记录,在使用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>

%d%p%class{1.}[%t]%位置%m%ex%n

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

异步记录器不同于AsyncAppender,因为异步记录器使用非阻塞数据结构(LMAX中断器)将日志事件排队。当您的应用程序有多个线程同时进行日志记录时,这种方法的优势就显现出来了。非阻塞队列意味着您的应用程序线程不需要争夺锁,从而提供更好的吞吐量和更低/更可预测的延迟

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

因为只有一个后台线程,所以该线程也不需要与其他线程争用I/O设备上的锁,同样提供了更好的性能

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


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

谢谢Remko。因此,如果我的应用程序中有30个线程,那么将有一个线程用于从非阻塞数据结构读取AsyncLoggerConfig?是否有一个选项可以增加日志记录的后台线程数,或者一个线程的规模足够大?是的,只有一个线程可以从队列中读取,并且您的应用程序可以有任意多个线程。不,没有增加后台线程数量的选项(单个线程可能扩展得更好,因为它不需要与其他线程争用IO设备上的锁).@RemkoPopma为什么使用LMAX Disruptor?您可以在这里使用任何其他非阻塞数据结构。@UmarTahir也许这值得提出自己的StackOverflow问题;你能为这个问题而不是评论吗?是的,当然,给我一点时间,我会创建一个问题,并与你分享