【问题标题】:How do you not output to stderr from a Java app?如何不从 Java 应用程序输出到 stderr?
【发布时间】:2015-08-06 15:57:17
【问题描述】:

我怎么会不小心从 Java 应用程序输出到 stderr?我刚读到这个:

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

这似乎输出到标准输出:

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

这个到标准错误:

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

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

我这样做是因为我设置了 Supervisord 来启动和监视我的 Java 应用程序,并且我的应用程序发出一些启动消息,并且 Supervisord 将一些消息记录到 stdout 日志,而将其他消息记录到 stderr 日志。我想知道我怎样才能控制这个。 stderr 中的大部分内容是我希望应用程序发出的启动消息。它们应该在标准输出日志中。

我最初将这个问题发布到 StackOverflow 并且最初将其表述为关于日志的问题,所以我被告知它必须转到 ServerFault。所以我把它转发到ServerFault,但它没有得到回应,主要是因为我认为这真的是一个应用程序问题。您可以在此处查看有关 ServerFault 的问题:

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

【问题讨论】:

    标签: java supervisord


    【解决方案1】:

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

    只需制作一些只遵循 PrintStream 接口的模拟类,您就可以开始了。

    【讨论】:

    • 我不确定我是否理解你。您是说 Standford 库执行此操作,还是我们需要包装对 Standford 库的所有调用?
    • 不知道有没有,但是如果有,你可以这样拦截。尝试制作自己的 PrintStream 什么都不做,看看它是否被调用
    【解决方案2】:

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

    的情况下获得标准错误输出的方法

    【讨论】:

    • 但是这些消息不是例外。
    • 这是一个不使用 System.err 将输出输出到 stderr 的示例。您可能不知道有数百个输出到 stderr 的库。除了阅读它的文档之外,没有其他办法。如果您希望所有输出都转到标准输出,请使用 Enerccio 的答案将标准错误重定向到全局标准输出。
    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2017-06-25
    • 2011-10-05
    • 2021-10-12
    • 2017-11-26
    • 2011-02-28
    相关资源
    最近更新 更多