在java中,是否有一种方法可以在每次向stderr写入内容时获得回调?

tktrz96b  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(273)

当任何东西都被写入stderr时,我想运行自己的java代码,但似乎找不到一种通用的方法。我们的目标是要么接收回调,要么重写打印到错误控制台的内容,可能在任何时候写入错误,比如使用log的error函数或exception的printstacktrace,我的代码都可以截获文本。在java中这怎么可能呢?

jaxagkaj

jaxagkaj1#

您可以调用system.seterr(printstream err)并将其设置为可以执行任何操作的printstream。throwable在打印堆栈跟踪时将使用system.err,因此您的printstream将被使用。

jtjikinw

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或类似的东西上放一条消息。

相关问题