你怎么不从Java应用程序输出到stderr?

时间:2015-08-06 15:57:18

标签: java supervisord

我怎么会意外地从Java应用程序输出到stderr?我刚刚读到这个:

http://tutorials.jenkov.com/java-io/system-in-out-error.html

这似乎输出到stdout:

System.out.println("File opened...");

这是stderr:

System.err.println("File opening failed:");

我从未故意输出到System.err,但我想知道Java中的某些函数是否会自动执行此操作?也许当抛出异常时?

我之所以这样,是因为我设置了Supervisord来启动和监控我的Java应用程序,我的应用程序会发出一些启动消息,而Supervisord会将一些消息记录到stdout日志中,而其他消息则记录到stderr日志中。我想知道如何控制这个。 stderr中的大多数内容都是我希望应用程序发出的启动消息。它们应该在stdout日志中。

我最初将这个问题发布到StackOverflow,我最初将其称为关于日志的问题,所以我被告知它必须转到ServerFault。所以我将它重新发布到ServerFault,但它没有得到任何响应,主要是因为我认为它确实是一个应用程序问题。您可以在此处查看ServerFault上的问题:

https://serverfault.com/questions/711199/how-would-i-tell-supervisord-that-these-messages-dont-belong-in-stderr

2 个答案:

答案 0 :(得分:1)

您可以使用:http://docs.oracle.com/javase/6/docs/api/java/lang/System.html#setErr%28java.io.PrintStream%29

只需制作一些模拟类,除了遵循PrintStream接口之外什么都不做,你就可以了。

答案 1 :(得分:0)

当抛出异常并且未捕获异常时,线程级uncaught exception handler会处理它。如果您指定了none,则使用默认值。 JLS未指定默认处理程序。但是oracle的默认处理程序打印到stderr。这是一种在不使用System.err

的情况下获取stderr输出的方法