在Log4J中,为什么转换模式中的%C会打印'';(问号)使用AsyncAppender?

在Log4J中,为什么转换模式中的%C会打印'';(问号)使用AsyncAppender?,log4j,Log4j,我在使用AsyncAppender的ConversionPattern中使用%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

我在使用AsyncAppender的ConversionPattern中使用%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:22570?-你好,世界

如果没有Asynapender,它可以正常工作:

2012/03/15 11:51:06002 Log4jTest-你好,世界

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

我错过了什么

请让我知道

提前感谢:-)

参考:

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

AsyncAppender还有一个可以设置的locationInfo标志。在这种情况下,%C和%M将按预期工作。如何解决此问题?