我在 ConversionPattern 中使用 AsyncAppender 的 %C 时遇到问题。

我的 Lo4J 配置是:

<?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> 

我的测试代码是:

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

测试代码的结果是:

2012/03/15 11:51:22,570 ? - Hello, world!

没有AsynAppender,它工作正常:

2012/03/15 11:51:06,002 Log4jTest - Hello, world!

使用 %c(类别),它也可以正常工作。

我错过了什么?

请告诉我。

提前致谢:-)

引用:

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

请您参考如下方法:

当使用“%C”或“%M”时,log4J使用Throwable.getStackTrace来获取stackTrace并使用此信息来获取调用者类和方法。 问题是,当使用 AsyncAppender 时,Throwable 是在另一个线程中创建的,并且 stackTrace 不包含调用者方法。


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!