2016-12-04 8 views
0

J'apprends actuellement sur Log4j et le livre que j'utilise explique AsyncAppenders. Je définis une taille de tampon à 128 (LoggingEvents). Le livre explique qu'aucun message ne sera imprimé jusqu'à ce que la taille de la mémoire tampon soit atteinte, mais mon programme imprime les messages de journalisation indépendamment de la taille de la mémoire tampon.AsyncAppender n'attend pas que le tampon soit plein avant d'écrire

Pourquoi est-ce le cas? Je vous serais reconnaissant d'autres indications sur AsyncAppenders si quelqu'un a des connaissances à leur sujet en utilisant :)

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> 

code 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(); 
} 

} 

Répondre

1

Ni le javadocs ou source code de dire que AsyncAppender aucun message ne sera imprimé jusqu'à ce que le tampon soit plein. En effet, d'après ma lecture du code:

  1. Le fil AsyncAppender.Dispatcher qui fait l'écriture sera réveillé chaque fois qu'un événement est ajouté et le tampon est vide.

  2. Une fois réveillé, il ne s'endort que lorsque le tampon est vide.

C'est à peu près le contraire de ce que dit le livre que vous lisez. (En supposant que vous l'avez lu correctement.)

+0

"Cet exemple définit simplement la taille de la mémoire tampon sur 4 pour l'AsyncAppender utilisé. L'AsyncAppender n'imprime aucun message tant que le nombre d'événements de journalisation est inférieur au taille de la mémoire tampon Une fois que le nombre d'événements de journalisation dépasse la taille de la mémoire tampon, la mémoire tampon est vidée et tous les messages sont imprimés. " Pro Apache Log4J deuxième édition –

+0

Dans ce cas, le livre est tout simplement incorrect. S'il avait dit * "... ce n'est pas spécifié ..." * cela aurait été correct. Mais le code source contredit clairement le livre, et le code source est définitif. –

+0

La seule explication possible qui pourrait rendre le livre correct est que les premières versions de 'AsyncAppender' auraient pu fonctionner comme ça. Cependant, le comportement prévu dans le code a été "impatient" async rinçage depuis v1.2.8 ... qui est la première version pour laquelle le code source est facilement accessible. (Tout est dans le lien Grepcode ci-dessus.) –