2012-03-15 11 views
8

Tengo un problema cuando uso% C en ConversionPattern con AsyncAppender.En Log4J, ¿por qué% C en ConversionPattern imprime '?' (signo de interrogación) con AsyncAppender?

Mi configuración Lo4J es:

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

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
    <appender name="console" class="org.apache.log4j.ConsoleAppender"> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{yyyy/MM/dd HH:mm:ss,SSS} %C{1} - %m%n" /> 
     </layout> 
    </appender> 
    <appender name="async_console" class="org.apache.log4j.AsyncAppender"> 
     <param name="BufferSize" value="1000" /> 
     <appender-ref ref="console" /> 
    </appender> 
    <root> 
     <level value="debug" /> 
     <!-- 
     <appender-ref ref="console" /> 
     --> 
     <appender-ref ref="async_console" /> 
    </root> 
</log4j:configuration> 

Y mi código de prueba es:

@Test 
public void testAsync() { 
    DOMConfigurator 
      .configure("src/test/resources/learningtest/log4j/log4j_test_async.xml"); 
    Logger log = Logger.getLogger(getClass()); 
    log.debug("Hello, world!"); 
    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

El resultado de la prueba es de código:

2012/03/15 11: 51: 22,570? - ¡Hola Mundo!

Sin AsynAppender, que funciona bien:

2012/03/15 11: 51: 06.002 Log4jTest - Hola, mundo!

Con% c (categoría), funciona bien, también.

¿Qué me estoy perdiendo?

Háganme saber.

Gracias de antemano :-)

Referencia:

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

Respuesta

9

Cuando se utiliza "% C" o "% M", Log4J utiliza Throwable.getStackTrace para obtener el StackTrace y use esta información para obtener la clase y el método de la persona que llama. El problema es que cuando se utiliza un AsyncAppender, Throwable se crea en otro subproceso y stackTrace no contiene el método de llamador.

+5

AsyncAppender también tiene una marca de ubicación de información que puede establecer. En este caso,% C y% M funcionarán como se esperaba – cchabanois

+0

¿cómo solucionar el problema? –

Cuestiones relacionadas