在 Java 中,有没有办法在每次向 stderr 写入内容时获得回调?
In Java, is there a way to get a callback every time something is written to stderr?
我想在向 stderr 写入任何内容时拥有自己的 java 代码 运行,但似乎找不到通用的方法。目标是接收回调或覆盖打印到错误控制台的内容,也许在任何时候写入错误的地方,例如使用日志的错误函数或 Exception 的 printStackTrace,我的代码将能够拦截文本。这在 Java 中怎么可能?
您可以调用 System.setErr(PrintStream err) and set it to a PrintStream that does whatever you like. A Throwable will use System.err when printing its stack trace,这样您的 PrintStream 就会被使用。
就像@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 或类似的消息。
我想在向 stderr 写入任何内容时拥有自己的 java 代码 运行,但似乎找不到通用的方法。目标是接收回调或覆盖打印到错误控制台的内容,也许在任何时候写入错误的地方,例如使用日志的错误函数或 Exception 的 printStackTrace,我的代码将能够拦截文本。这在 Java 中怎么可能?
您可以调用 System.setErr(PrintStream err) and set it to a PrintStream that does whatever you like. A Throwable will use System.err when printing its stack trace,这样您的 PrintStream 就会被使用。
就像@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 或类似的消息。