我正在尝试设置异步日志记录,并希望仅在达到缓冲区大小限制时才写入日志。
因此,每次写入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,但它似乎并不是异步的。当我使用应用程序时,日志文件被持续写入。
我是不是做错了什么?
发布于 2016-02-07 15:04:18
你没做错什么。对于异步日志记录,Log4j 2中的immediateFlush=false实际上意味着“仅在必要时或在批处理结束时刷新”。
缓冲日志记录有很大的性能优势,但缺点是您通常看不到最新的日志输出,因为它还没有被刷新到磁盘。
Log4j 2中的异步日志记录使用“智能批处理”:不仅在缓冲区已满时,而且在日志事件队列为空且后台线程没有任何其他工作要做时,也会刷新缓冲区。
这样做的好处是,您的日志事件在磁盘上立即可见,但比设置immediateFlush=true效率高得多。
https://stackoverflow.com/questions/35246025
复制相似问题