【问题标题】:How to monitor STDERR in Java?如何在 Java 中监控 STDERR?
【发布时间】:2014-09-30 10:21:54
【问题描述】:

我们正在与第 3 方 API 集成,并购买了使用其 Java 库的许可(以面向对象的方式包装 API 调用)。

这个 Java 库的唯一问题是,如果 API 调用失败,它不会抛出异常或错误。我们从客户端获得的唯一指示是输出到 STDOUT(成功)或 STDERR(失败)。

因此,运行:

try {
    com.the.third.party.java.lib.FizzBuzz.doSomething();
} catch(Throwable t) {
    log.error(t);
}

...从来没有抓住任何东西。如果在 doSomething() 运行时发生错误,我们将简单地看到以下字符串打印到 STDERR:

Error: <details of the error here>

所以我想知道是否有办法监控 STDERR (System.err) 任何包含子字符串“Error:”的输出?由于流缓冲,这可能会变得有些复杂,所以我不确定正确的方法应该是什么。

【问题讨论】:

    标签: java monitor stderr


    【解决方案1】:

    首先,如果有另一种检测错误的方法不涉及执行此操作,请改为执行此操作。你未来的自己会感谢你的。

    但如果你真的需要听System.err,你可能想使用System.setErr(PrintStream)。编写您自己的 PrintStream 子类,在正在打印的文本中查找“错误:”。

    【讨论】:

    • 感谢@immibus (+1) - 我想我应该保存现有的System.err 之前调用FizzBuzz.doSomething(),然后将其换回我的自定义 PrintStream 方法执行之后(以保持应用程序的其余部分正确引导 STDERR 流量?此外,更重要的是,这个自定义 PrintStream 可能是什么样的? 再次感谢!
    • 不幸的是我最近也不得不做这样的事情;我遇到了以下库,它将 sysout 和 err 重定向到 slf4j。它可以作为一个例子来效仿。 github.com/Mahoney/sysout-over-slf4j.
    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    相关资源
    最近更新 更多