在 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 或类似的消息。