为什么 ConsoleAppender 会抛出“没有为名为 [null] 的追加器设置输出流或文件”?

2022-09-04 01:41:17

我在 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_OUTactivateOptions

如果您使用自己,那么您还需要显式设置目标并调用 。setLayoutactivateOptions


答案 2

推荐