为什么ConsoleAppender会为名为[null]的appender抛出"没有输出流或文件集"?

Ago*_*noX 12 java log4j consoleappender

我遇到了log4j的问题ConsoleAppender:

如果我像这样初始化它:

ConsoleAppender ca = new ConsoleAppender();
ca.setLayout(new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN));
Run Code Online (Sandbox Code Playgroud)

它会出错并打破日志记录.

错误输出:

log4j:ERROR没有名为[null]的appender的输出流或文件集.

如果我像这样初始化它工作正常:

ConsoleAppender ca = new ConsoleAppender(new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN));
Run Code Online (Sandbox Code Playgroud)

有没有人遇到过这个问题?我无法在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");

}

}
Run Code Online (Sandbox Code Playgroud)

ska*_*man 17

如果您查看 ConsoleAppender 的源代码,您可以看到为什么会发生这种情况:

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

  public ConsoleAppender(Layout layout, String target) {
    setLayout(layout);
    setTarget(target);
    activateOptions();
  }
Run Code Online (Sandbox Code Playgroud)

您可以看到ConsoleAppender(Layout)传递SYSTEM_OUT作为目标,也可以activateOptions在设置布局和目标后调用.

如果你setLayout自己使用,那么你还需要明确设置目标和调用activateOptions.

  • 大!你这么帮助我 我没有找到它,因为我调试了log方法以找出异常发生的位置.但它很深,一旦发现,它无助于获得解决方案.查看ConsoleAppender构造函数内部并了解.谢谢! (2认同)