我正在使用log4j2
的以下配置,并注意到日志语句在被刷新到磁盘之前存储在内存中。是否有一个设置来控制在刷新到磁盘之前存储在内存中的消息数量?
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug" name="TestApp" packages="">
<Appenders>
<RollingRandomAccessFile name="RollingRandomAccessFile" fileName="logs/test.log" immediateFlush="false" append="false"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="500 MB"/>
</Policies>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<AsyncLogger name="FATAL_LOGGER" level="fatal" includeLocation="true" additivity="false">
<AppenderRef ref="RollingRandomAccessFile"/>
</AsyncLogger>
<Root level="debug" includeLocation="false">
<AppenderRef ref="RollingRandomAccessFile"/>
</Root>
</Loggers>
</Configuration>
答案 0 :(得分:3)
请注意,您可以控制缓冲区大小,但无法控制在刷新到磁盘之前存储在内存中的消息数量。这是这些消息产生速度与消耗速度的函数关系。如果您的队列大小太小而且缓冲区中的缓冲区已满,则对logger.log(...)的调用将会阻塞,直到缓冲区中的空间可用为止。所以要小心将尺寸设置得太小,除非你在一个内存很少的平台上(嵌入式或手机等)。
答案 1 :(得分:0)
您可以更改AsyncLogger.RingBufferSize值(默认值为256*1024
&amp;最小值为128
)。这应该有助于配置在刷新到磁盘之前分配的对象数。