【问题标题】:Memory usage of log4j2 AsyncLoggerlog4j2 AsyncLogger 的内存使用情况
【发布时间】:2014-11-13 04:57:18
【问题描述】:

我正在为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>

【问题讨论】:

  • 更多人似乎对编辑感兴趣,而不是实际回答。我知道编辑很重要,但我认为没有人(知道答案的人)根据原始格式误解了实际问题。

标签: java logging configuration log4j log4j2


【解决方案1】:

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

【讨论】:

  • 设置它的最佳方法是什么 - 配置或系统属性?有一个可行的例子吗?
【解决方案2】:

请注意,您可以控制缓冲区大小,但无法控制在刷新到磁盘之前将多少消息存储在内存中。这是生成这些消息的速度与消耗它们的速度的函数。如果您的队列太小并且您的缓冲区在突发期间已满,则对 logger.log(...) 的调用将阻塞,直到缓冲区中的空间再次可用。所以要小心不要让尺寸太小,除非你在一个内存很小的平台上(嵌入式或电话左右)。

【讨论】:

  • 谢谢!!我正在使用小型虚拟机(现在无法更改),因此内存有限。我仍然更喜欢使用这条路线,但只是使用更小的缓冲区和更频繁的磁盘写入。立即测试
  • 另外,您能否评论一下 - 处理此问题的最佳方法是什么 - 通过配置或系统属性
  • Async Logger ringbuffer 大小目前只能通过系统属性配置。
  • 谢谢 - 这会起作用还是我需要做其他事情:System.setProperty("AsyncLoggerConfig.RingBufferSize", "128 * 1024");
  • 你需要输入实际整数:131072
猜你喜欢
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 2012-05-30
相关资源
最近更新 更多