java - 异步日志缓冲区的实现

标签 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,但它似乎不是异步的。当我使用该应用程序时,日志文件被不断写入。

我做错了什么吗?

最佳答案

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

缓冲日志记录具有巨大的性能优势,但也有一个缺点,即您通常无法看到最新的日志输出,因为它尚未刷新到磁盘。

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

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

关于java - 异步日志缓冲区的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35246025/

相关文章:

java - picasso 和 ImageLoader android

java - 迭代器找不到符号方法 add()

java - 如何在 asyncExec() 调用中更新 SWT GUI

c# - .NET 中的异步读取问题 - 似乎我的回调在不应该被调用时被多次调用

Javascript - 并行调用两个异步函数并将两个结果传递给第三个函数

python - 在 Python 中拦截所有日志记录

java - Java JVM 是否使用 pthread?

java - 序列化一个以后可能会改变的java对象

logging - 检查是否设置了特定级别,如果设置了,则登录该级别

mysql - 哪种类型的事件更适合存储在数据库中以供日志使用?