为什么java.util.logging.Logger打印到stderr?

时间:2015-12-08 12:34:26

标签: java eclipse logging stderr java.util.logging

我有一个简单的设置来记录消息:JDK 8 Update 65Eclipse Mars

import java.util.logging.Logger;

public class Example {

    private final static Logger LOGGER = Logger.getLogger(Example.class.getName());

    public static void main(String[] args) {
        LOGGER.info("Test");
    }

}

我希望在stdout上获得输出,就像使用System.out.println();一样。
而是它会打印在stderr上,这会在eclipse控制台上产生一个红色字体:

enter image description here

我知道我可以通过编写自定义Handler来更改此行为,但我想知道为什么默认输出会显示在stderr而不是stdout上?

记录器应使用stdout fine + info并使用stderr severe级别。

5 个答案:

答案 0 :(得分:3)

有很好的记录。默认情况下,记录器以递归方式发布到其父级处理程序,直到指定另一个处理程序。您可以遍历父级的处理程序,并查看父级记录器的默认处理程序是ConsoleHandler,它使用System.err发布日志记录。

public class Main {
    public static void main(String[] args) {
        Handler[] handlers = Logger.getLogger(Main.class.getName()).getParent().getHandlers();
        for (Handler handler : handlers) {
            System.out.println(handler.getClass().getName());
        }
    }
}

答案 1 :(得分:3)

java.util.logging API是在JSR 47: Logging API Specification下开发的。根据"提议的最终草案"中的更改日志; ConsoleHandler始终使用System.err。 JCP页面还列出了API的原始作者,我认为只有这些名称才能真正了解您问题的答案。

我认为原点来自于记录用于报告失败并且失败报告被定向到System.err的思维模式。实际上对于ConsoleHandler,INFO之上的任何级别都应该转到错误流,如果您在添加日志API之前尝试维护JDK的先例,那么任何级别的INFO或更低级别应该转出流。

答案 2 :(得分:1)

默认情况下,记录器将级别INFO及以上的日志记录(即INFO,WARNING和SEVERE)输出到标准错误流(System.err)。

来源:www3.ntu.edu.sg/home/ehchua/programming/java/JavaLogging.html

答案 3 :(得分:1)

您可以创建并扩展ConsoleHandler,以将输出设置为System.out,而不是System.err

Logger logger = Logger.getLoger("your_logger_name");
logger.setUseParentHandler(false);
logger.addHandler(new ConsoleHandler() {
    {setOutputStream(System.out);}
});

现在,此记录器上的所有消息都将显示在System.out控制台中。

答案 4 :(得分:0)

他们使用stderr的原因是因为此流“用于程序发出的错误消息和诊断”(来源:https://www.gnu.org/software/libc/manual/html_node/Standard-Streams.html)。