我在基于Java Play框架的应用程序中使用Log4J2 AsyncLogger。在高并发情况下(每个服务器约3000个用户),环形缓冲区的剩余大小很快就会降至零,并且我的请求开始失败。我的环形缓冲区大小为1048576(512 *2048)。应用程序线程数为8(如Play官方文档中所述,每个核心1个线程)。
我的问题是:
1> 如何增加消费者将日志写入文件的速度? 2> 我可以显式地使用多个消费者来写入我的日志文件吗?如果可以,在哪里指定这些消费者?
我已经包含了我的log4j2.xml文件。非常感谢任何帮助 :)
我尝试过的事情:
1> 增加环形缓冲区大小(始终是2的幂)。但最终会出现同样的问题,而且使用太多内存似乎不太优雅。这个选项在生产中将被否决。我错过了什么吗? 2> 尝试了不同的等待策略,但没有运气。
我的问题是:
1> 如何增加消费者将日志写入文件的速度? 2> 我可以显式地使用多个消费者来写入我的日志文件吗?如果可以,在哪里指定这些消费者?
我已经包含了我的log4j2.xml文件。非常感谢任何帮助 :)
我尝试过的事情:
1> 增加环形缓冲区大小(始终是2的幂)。但最终会出现同样的问题,而且使用太多内存似乎不太优雅。这个选项在生产中将被否决。我错过了什么吗? 2> 尝试了不同的等待策略,但没有运气。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<!-- status="trace" attribute for Configuration tag prints in logs [ Starting AsyncLoggerConfig disruptor for this configuration with ringbufferSize=262144] -->
<!-- default log file names in case it fails to read it from property file -->
<Properties>
<Property name="FILE_NAME">/opt/lol/logs/meh.log</Property>
<Property name="FILE_PATTERN">/opt/lol/logs/meh_%d{yyyy-MM-dd_HH}.log</Property>
</Properties>
<Appenders>
<RollingRandomAccessFile name="ASYNCFILE" fileName="${sys:FILE_NAME}" filePattern="${sys:FILE_PATTERN}">
<PatternLayout pattern="[meh:%d{yyyy-MM-dd HH:mm:ss},%d{SSS}] %-5level[%thread][%C{1}:%L] %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
</RollingRandomAccessFile>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="[meh:%d{yyyy-MM-dd HH:mm:ss},%d{SSS}] %-5level[%thread][%C{1}:%L] %msg%n"/>
</Console>
</Appenders>
<Loggers>
<logger name="akka" level="INFO" />
<AsyncRoot level="INFO" includeLocation="true">
<!-- <AppenderRef ref="CONSOLE"/>-->
<AppenderRef ref="ASYNCFILE"/>
</AsyncRoot>
</Loggers>
</Configuration>
我希望每个盒子的并发数至少达到4000(与没有记录器时相同)。但是我卡在了大约2500个左右。