如何不显示来自第三方jar的stdout并且只显示slf4j日志

时间:2018-03-20 13:17:23

标签: java maven slf4j

我正在使用有很多System.out.println()的第三方jar。我对这些消息不感兴趣。它还使用我感兴趣的slf4j日志。 那么如何在我的标准输出中过滤掉System.out.println()个消息。有快速的方法吗?我试图避免编写任何脚本来解析整个日志并只保留相关的日志。我正在使用maven。

我更喜欢将logger日志作为stdout和system.out作为文件..这样我就可以在构建环境中运行构建时看到相关日志。

2 个答案:

答案 0 :(得分:1)

我建议redirect System.out to slf4j。这样,可以以标准化的常规方式在日志记录框架中配置所有日志记录。

请注意,根据您用来进行重定向的库,如果您有一些记录器打印到标准输出,您可能需要carefully configure it以便不会结束一个无限循环,打印的消息被重定向到日志记录,被重定向到打印消息,等等。

另请注意,大多数构建环境& IDE支持在生成日志文件时查看日志文件的内容,因此如果您不想,则不必将任何内容打印到标准输出。

答案 1 :(得分:0)

重定向System.out和System.err。

但要小心:如果您使用Simple Logger将会有一个递归

stdoutstderr将重定向到我们自己的OutputStream实现(请参阅代码注释)。我们自己的实现将输出重定向到slf4j

System.setOut(new PrintStream(new OutputStream() {

    ByteArrayOutputStream buffer = new ByteArrayOutputStream();

    //
    // Our own implementation of write
    //
    @Override
    public void write(int b) throws IOException {
        //
        // After a line break the line will redirect to slf4j
        //
        if ((b == '\r') || (b == '\n')) {
            // Only 'real' content will redirect to slf4j
            if (buffer.size() != 0) {
                LoggerFactory.getLogger("foo").info(new String(buffer.toByteArray(), "UFT-8"));
            }
            // A new buffer is needed after a line break
            // (there is no 'clear()')
            buffer = new ByteArrayOutputStream();
        }
        buffer.write(b);
    }
}));
System.setErr(new PrintStream(new OutputStream() {

    ByteArrayOutputStream buffer = new ByteArrayOutputStream();


    //
    // Our own implementation of write
    //
    @Override
    public void write(int b) throws IOException {
        if ((b == '\r') || (b == '\n')) {
            if (buffer.size() != 0) {
                LoggerFactory.getLogger("foo").error(new String(buffer.toByteArray(), "UFT-8"));
            }
            buffer = new ByteArrayOutputStream();
        }
        buffer.write(b);
    }
}));