log4j2 AsyncLogger的内存使用情况

时间:2014-09-18 18:17:34

标签: java logging configuration log4j log4j2

我正在使用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>

2 个答案:

答案 0 :(得分:3)

请注意,您可以控制缓冲区大小,但无法控制在刷新到磁盘之前存储在内存中的消息数量。这是这些消息产生速度与消耗速度的函数关系。如果您的队列大小太小而且缓冲区中的缓冲区已满,则对logger.log(...)的调用将会阻塞,直到缓冲区中的空间可用为止。所以要小心将尺寸设置得太小,除非你在一个内存很少的平台上(嵌入式或手机等)。

答案 1 :(得分:0)

您可以更改AsyncLogger.RingBufferSize值(默认值为256*1024&amp;最小值为128)。这应该有助于配置在刷新到磁盘之前分配的对象数。