我正在尝试设置异步日志记录,并且仅在达到缓冲区大小限制时才写入日志。
因此,每次写入 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,但它似乎不是异步的。当我使用该应用程序时,日志文件被不断写入。
我做错了什么吗?
最佳答案
你没有做错任何事。对于异步日志记录,Log4j 2 中的immediateFlush=false 实际上意味着“仅在必要时或在批处理结束时刷新”。
缓冲日志记录具有巨大的性能优势,但也有一个缺点,即您通常无法看到最新的日志输出,因为它尚未刷新到磁盘。
Log4j 2 中的异步日志记录使用“智能批处理”:缓冲区不仅在已满时刷新,而且在日志事件队列变空且后台线程没有任何其他工作要做时刷新。这样做的好处是您的日志事件可以立即在磁盘上可见,但比设置immediateFlush=true 更有效。
关于java - 异步日志缓冲区的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35246025/