Почему в Log4J% C в ConversionPattern печатает '?' (вопросительный знак) с AsyncAppender? - PullRequest
9 голосов
/ 15 марта 2012

У меня проблема при использовании% C в ConversionPattern с AsyncAppender.

Моя конфигурация 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?- Привет, мир!

Без AsynAppender все работает нормально:

2012/03/15 11: 51: 06,002 Log4jTest - Привет, мир!

С% c (категория) он тоже работает нормально.

Что мне не хватает?

Пожалуйста, дайте мне знать.

Заранее спасибо:-)

Ссылка:

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

1 Ответ

9 голосов
/ 08 июня 2012

При использовании «% C» или «% M» log4J использует Throwable.getStackTrace для получения stackTrace и использует эту информацию для получения класса и метода вызывающей стороны. Проблема заключается в том, что при использовании AsyncAppender Throwable создается в другом потоке, а stackTrace не содержит метод вызывающей стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...