Почему ConsoleAppender выбрасывает "нет потока вывода или файла для приложения с именем [null]"?

У меня проблема с 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 ответ

Решение

Вы можете понять, почему это происходит, если вы посмотрите на источник для 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,

Другие вопросы по тегам