2016-12-04 4 views
0

В настоящее время я изучаю 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(); 
} 

} 

ответ

1

Ни javadocs или source code из AsyncAppender говорят, что никакие сообщения не будут напечатаны до тех пор, пока буфер не будет заполнен. Действительно, в соответствии с моим чтением кода:

  1. AsyncAppender.Dispatcher нить, которая делает написание будет разбужен, когда событие добавляется и буфер пуст.

  2. Как только проснется, он не заснет до тех пор, пока буфер не станет пустым.

Это почти что противоположно тому, что говорится в книге, которую вы читаете. (При условии, что вы правильно читать.)

+0

«Этот пример просто устанавливает размер буфера до 4 для AsyncAppender используется. AsyncAppender не будет печатать никаких сообщений до тех пор, как число лесозаготовительных событий меньше, чем размер буфера. Как только количество событий регистрации превысит размер буфера, буфер сброшен, и все сообщения будут напечатаны ». Pro Apache Log4J второе издание –

+0

В этом случае книга явно неверна. Если бы он сказал * «... это не указано ...» *, это было бы правильно. Но исходный код явно противоречит книге, а исходный код является окончательным. –

+0

Единственное возможное объяснение, которое могло бы привести к правильной версии книги, состояло бы в том, что ранние версии «AsyncAppender» могли бы работать так. Тем не менее, предполагаемое поведение в коде было «нетерпеливым» асинхронным спингом с версии v.1.2.8 ..., которая является самой ранней версией, для которой исходный код легко доступен. (Это все в ссылке Grepcode выше.) –

Смежные вопросы