Почему 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.