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

Den*_*hel 11 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");
    }

}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

我知道我可以通过编写自定义来改变这种行为Handler,但我想知道为什么默认输出会出现在?stderr而不是stdout

记录器应该stdout用于fine+ infostderr用于severe级别.

jme*_*ens 5

java.util.logging中的API是下开发日志API规范:JSR 47。根据“Proposed Final Draft”中的更改日志,ConsoleHandler 始终使用 System.err。JCP 页面还列出了 API 的原始作者,我认为只有这些名字才真正知道您的问题的答案。

也就是说,我认为起源来自System.err API 文档。

通常,此流对应于主机环境或用户指定的显示输出或另一个输出目的地。按照惯例,此输出流用于显示错误消息或其他信息,即使主要输出流(变量 out 的值)已重定向到文件或其他目标通常不会持续监控。

反对System.out

“标准”输出流。此流已打开并准备好接受输出数据。通常,此流对应于主机环境或用户指定的显示输出或另一个输出目的地。

记录映射到诊断而不是原始数据。将数据与诊断错误信息分开是很重要的,尤其是当管道过程在一起时,因为下游消费者只准备接受数据信息而不是错误消息。请参阅对标准输入、标准输出和标准错误感到困惑?了解更多详细信息。


小智 2

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

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

  • OP 已经知道记录器会这样做,问题是:“为什么”。 (4认同)