Почему ConsoleAppender выдает «поток вывода или файл для приложения с именем [null]»? - PullRequest
12 голосов
/ 30 мая 2011

У меня возникла проблема с log4j ConsoleAppender:

Если я инициализирую это так:

ConsoleAppender ca = new ConsoleAppender();
ca.setLayout(new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN));

, это выдает ошибку и прерывает ведение журнала.

Ошибка вывода:

log4j: ОШИБКА Нет выходного потока или набора файлов для приложения с именем [null].

Если я инициализирую его следующим образом, он работает нормально:

ConsoleAppender ca = new ConsoleAppender(new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN));

Кто-нибудь сталкивался с этой проблемой?Я не могу найти его в репозитории Bugzilla, но если бы это было эффективно, это было бы совершенно очевидно!

Возможно, я смотрю не в том месте?

Соответствующий код:

import org.apache.log4j.*;

public class ConsoleAppenderIssue {
private static Logger logger = Logger.getLogger(ConsoleAppenderIssue.class);

public static void main(String [] args) {
    ConsoleAppender ca = new ConsoleAppender();
    ca.setLayout(new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN));

    logger.addAppender(ca);

    logger.info("log something");

}

}

1 Ответ

16 голосов
/ 30 мая 2011

Вы можете понять, почему это происходит, если вы посмотрите на источник для ConsoleAppender:

  public ConsoleAppender(Layout layout) {
    this(layout, SYSTEM_OUT);
  }

  public ConsoleAppender(Layout layout, String target) {
    setLayout(layout);
    setTarget(target);
    activateOptions();
  }

Вы увидите, что ConsoleAppender(Layout) передает SYSTEM_OUT в качестве цели, итакже, что он вызывает activateOptions после установки макета и цели.

Если вы используете setLayout самостоятельно, то вам также необходимо явно установить цель и вызвать activateOptions.

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