2015-12-08 46 views
6

我有一个简单的设置登录消息:JDK 8 Update 65Eclipse Mars为什么java.util.logging.Logger会打印到stderr?

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

记录程序应该使用stdoutfine + info和使用stderrsevere水平。

回答

0

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

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

+0

您是否有此声明的来源或证据? –

+0

对不起,我应该在评论中提供它:) https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaLogging.html –

+0

记录器是否已经被OP知道,问题是:“为什么”。 – Tom

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()); 
     } 
    } 
} 
2

java.util.logging APIJSR 47: Logging API Specification下开发的。根据“建议的最终草案”中的更改日志,ConsoleHandler始终使用System.err。 JCP页面还列出了API的原始作者,我认为只有这些名称才能真正知道你的问题的答案。

我会想象,起源来自记录是报告失败和失败报告指向System.err的心态。对于ConsoleHandler来说,如果您在添加日志API之前尝试维护JDK的先例,那么INFO之上的任何级别应该转到错误流,并且任何级别INFO或更少级别都应该转出流。

相关问题