我有一个简单的设置来记录消息:JDK 8 Update 65
和Eclipse 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控制台上产生一个红色字体:
我知道我可以通过编写自定义Handler
来更改此行为,但我想知道为什么默认输出会显示在stderr
而不是stdout
上?
记录器应使用stdout
fine
+ info
并使用stderr
severe
级别。
答案 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)。