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 code 或 AsyncAppender
都没有说在缓冲区满之前不会打印任何消息。确实,根据我对代码的阅读:
每当附加事件且缓冲区为空时,执行写入的AsyncAppender.Dispatcher
线程将被唤醒。
一旦被唤醒,直到缓冲区为空才会休眠。
这与您正在阅读的书中所说的几乎相反。 (假设你没看错。)
我目前正在学习 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 code 或 AsyncAppender
都没有说在缓冲区满之前不会打印任何消息。确实,根据我对代码的阅读:
每当附加事件且缓冲区为空时,执行写入的
AsyncAppender.Dispatcher
线程将被唤醒。一旦被唤醒,直到缓冲区为空才会休眠。
这与您正在阅读的书中所说的几乎相反。 (假设你没看错。)