Async日志缓冲区的实现

时间:2016-02-06 20:21:30

标签: java asynchronous logging configuration log4j2

我正在尝试设置异步日志记录,并且只有在达到缓冲区大小限制时才想写入日志。

所以每次写入8MB的日志数据,然后将所有内容刷新到program.log

我当前的log4j2.xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace" monitorInterval="5">
    <Properties>
            <Property name="log-path">/opt/job/log</Property>

    </Properties>
    <Appenders>
            <RollingFile name="CONSOLE_C" fileName="${log-path}/program.log" immediateFlush="false" append="false"
                    filePattern="${log-path}/program-%d{yyyy-MM-dd}-%i.log">
                    <PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [ %-5p ] [%5X{TId}] [%22X{Info}] [ %20c ] - %-m %n"/>
                    <Policies>
                            <SizeBasedTriggeringPolicy size="10240 KB" />
                    </Policies>
                    <DefaultRolloverStrategy max="15" />
            </RollingFile>
            <Async name="Async" bufferSize="8000" shutdownTimeout="100" >
                    <AppenderRef ref="CONSOLE_C"/>
            </Async>
    </Appenders>
    <Loggers>       
            <Root level="debug">
                    <AppenderRef ref="CONSOLE_C" />
            </Root >
    </Loggers>

虽然我将大部分数据写入program.log但它看起来并不是异步的。在我使用应用程序时,正在连续写入日志文件。

我有什么不对劲吗?

1 个答案:

答案 0 :(得分:1)

你没有做错任何事。对于异步日志记录,Log4j 2中的immediateFlush = false实际上意味着“仅在必要时或在批处理结束时刷新”。

缓冲日志记录具有很好的性能优势,但缺点是通常无法看到最新的日志输出,因为它尚未刷新到磁盘。

Log4j 2中的异步日志记录使用“智能批处理”:缓冲区不仅在其已满时刷新,而且在日志事件队列变空且后台线程没有任何其他工作要做时也被刷新。

这样做的好处是您的日志事件可以立即在磁盘上看到,但比设置immediateFlush = true更有效。