В настоящее время я изучаю Log4j, а книга, которую я использую, объясняет AsyncAppenders. Я установил размер буфера 128 (LoggingEvents). В книге объясняется, что никакие сообщения не будут напечатаны до тех пор, пока размер буфера не будет достигнут, однако моя программа печатает сообщения о регистрации независимо от размера буфера.AsyncAppender не дожидался заполнения буфера перед записью
Почему это так? Я был бы признателен за любые другие указатели о 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();
}
}
«Этот пример просто устанавливает размер буфера до 4 для AsyncAppender используется. AsyncAppender не будет печатать никаких сообщений до тех пор, как число лесозаготовительных событий меньше, чем размер буфера. Как только количество событий регистрации превысит размер буфера, буфер сброшен, и все сообщения будут напечатаны ». Pro Apache Log4J второе издание –
В этом случае книга явно неверна. Если бы он сказал * «... это не указано ...» *, это было бы правильно. Но исходный код явно противоречит книге, а исходный код является окончательным. –
Единственное возможное объяснение, которое могло бы привести к правильной версии книги, состояло бы в том, что ранние версии «AsyncAppender» могли бы работать так. Тем не менее, предполагаемое поведение в коде было «нетерпеливым» асинхронным спингом с версии v.1.2.8 ..., которая является самой ранней версией, для которой исходный код легко доступен. (Это все в ссылке Grepcode выше.) –