当任何东西都被写入stderr时,我想运行自己的java代码,但似乎找不到一种通用的方法。我们的目标是要么接收回调,要么重写打印到错误控制台的内容,可能在任何时候写入错误,比如使用log的error函数或exception的printstacktrace,我的代码都可以截获文本。在java中这怎么可能呢?
jaxagkaj1#
您可以调用system.seterr(printstream err)并将其设置为可以执行任何操作的printstream。throwable在打印堆栈跟踪时将使用system.err,因此您的printstream将被使用。
jtjikinw2#
就像@eis所说的,您可以设置自己的printstream。下面是一个示例,说明在向stderr写入内容时如何注册这样的回调。
import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.util.function.Consumer; public class PrintStreamExample { public static void main(String... args) { System.setErr(new PrintStream(new MyOutputStream(i -> System.out.println(i)), true)); throw new IllegalArgumentException("boo"); } private static class MyOutputStream extends OutputStream { private final Consumer<String> consumer; private final StringBuffer stringBuffer = new StringBuffer(); public MyOutputStream(Consumer<String> consumer) { this.consumer = consumer; } @Override public void write(int b) throws IOException { stringBuffer.append((char) b); } @Override public void flush() { if (!stringBuffer.isEmpty()) { consumer.accept(stringBuffer.toString().trim()); stringBuffer.delete(0, stringBuffer.length()); } } } }
所以请注意,在本例中,回调(消费者)只是打印到system.out,在这种情况下,这当然是愚蠢的,但在一个真实的例子中,我可以想象您可能想要在kafka或类似的东西上放一条消息。
2条答案
按热度按时间jaxagkaj1#
您可以调用system.seterr(printstream err)并将其设置为可以执行任何操作的printstream。throwable在打印堆栈跟踪时将使用system.err,因此您的printstream将被使用。
jtjikinw2#
就像@eis所说的,您可以设置自己的printstream。下面是一个示例,说明在向stderr写入内容时如何注册这样的回调。
所以请注意,在本例中,回调(消费者)只是打印到system.out,在这种情况下,这当然是愚蠢的,但在一个真实的例子中,我可以想象您可能想要在kafka或类似的东西上放一条消息。