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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6174973/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 14:40:37  来源:igfitidea点击:

Why is ConsoleAppender throwing "no output stream or file set for the appender named [null]"?

javalog4jconsoleappender

提问by AgostinoX

I'm experiencing an issue with log4j ConsoleAppender:

我遇到了 log4j 问题ConsoleAppender

If I initialize it like this:

如果我像这样初始化它:

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

it gives an error and breaks the logging.

它给出了一个错误并中断了日志记录。

Error output:

错误输出:

log4j:ERROR No output stream or file set for the appender named [null].

log4j:ERROR 没有为名为 [null] 的 appender 设置输出流或文件。

If I initialize it like this it works fine:

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

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

Has anyone experienced this issue? I can't find it in the Bugzilla repository, but if it effectively was an issue it would be quite evident!

有没有人遇到过这个问题?我在 Bugzilla 存储库中找不到它,但如果它实际上是一个问题,那就很明显了!

Perhaps I'm looking in the wrong place?

也许我找错了地方?

Relevant code:

相关代码:

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");

}

}

回答by skaffman

You can see why this is happening if you look at the sourcefor ConsoleAppender:

如果您查看ConsoleAppender的源代码,您就会明白为什么会发生这种情况:

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

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

You can see that ConsoleAppender(Layout)passes SYSTEM_OUTas the target, and also that it calls activateOptionsafter setting the layout and target.

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

If you use setLayoutyourself, then you'll also need to explicitly set the target and call activateOptions.

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