首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步日志记录缓冲区的实现

异步日志记录缓冲区的实现
EN

Stack Overflow用户
提问于 2016-02-07 04:21:30
回答 1查看 753关注 0票数 2

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

因此,每次写入8MB日志数据时,才会将所有内容刷新到program.log

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

代码语言:javascript
复制
<?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,但它似乎并不是异步的。当我使用应用程序时,日志文件被持续写入。

我是不是做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2016-02-07 15:04:18

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

缓冲日志记录有很大的性能优势,但缺点是您通常看不到最新的日志输出,因为它还没有被刷新到磁盘。

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

这样做的好处是,您的日志事件在磁盘上立即可见,但比设置immediateFlush=true效率高得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35246025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档