AsyncAppender 在写入之前不会等待缓冲区已满

AsyncAppender does not wait for buffer to be full before writing

我目前正在学习 Log4j,我正在使用的书正在解释 AsyncAppenders。我将缓冲区大小设置为 128 (LoggingEvents)。书中解释说,在达到缓冲区大小之前不会打印任何消息,但是无论缓冲区大小如何,我的程序都会打印日志消息。

为什么会这样?如果有人知道如何使用它们,我将不胜感激关于 AsyncAppenders 的任何其他指示:)

Log4j.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
    debug="true">

    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
    <appender-ref ref="CONSOLE"/>
    <param name="BufferSize" value="128"/>
    </appender>

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%d %-5p [%t] - %m%n"/>
    </layout>
    </appender>

    <logger name="org.example.christopher" additivity="false">
    <level value="debug"/>
    <appender-ref ref="ASYNC"/>
    </logger>
    <root>
    <priority value="debug"/>
    </root>
    </log4j:configuration>

Java代码

package org.example.christopher;

import org.apache.log4j.*;
import org.apache.log4j.xml.DOMConfigurator;


public class AsyncLogging{

private static Logger logger = Logger.getLogger(AsyncLogging.class.getPackage().getName());
private AsyncAppender asyncAppender = null;
private ConsoleAppender consoleAppender = null;

public AsyncLogging(){

try{
logger.setAdditivity(false);
asyncAppender = (AsyncAppender) logger.getAppender("ASYNC");
asyncAppender.setBufferSize(128);
}
catch (Exception e){
System.out.println("error: " + e.toString());
}

}

public void doLogging(){
logger.debug("Debug 1");
logger.debug("Debug 2");
logger.debug("Debug 3");
//logger.debug("Debug 4");
//logger.debug("Debug 5");
}


public static void main(String ... args){
AsyncLogging asyncLogging = new AsyncLogging();
asyncLogging.doLogging();
}

}

javadocs or the source codeAsyncAppender 都没有说在缓冲区满之前不会打印任何消息。确实,根据我对代码的阅读:

  1. 每当附加事件且缓冲区为空时,执行写入的AsyncAppender.Dispatcher线程将被唤醒。

  2. 一旦被唤醒,直到缓冲区为空才会休眠。

这与您正在阅读的书中所说的几乎相反。 (假设你没看错。)