我正在使用有很多System.out.println()
的第三方jar。我对这些消息不感兴趣。它还使用我感兴趣的slf4j日志。
那么如何在我的标准输出中过滤掉System.out.println()
个消息。有快速的方法吗?我试图避免编写任何脚本来解析整个日志并只保留相关的日志。我正在使用maven。
我更喜欢将logger日志作为stdout和system.out作为文件..这样我就可以在构建环境中运行构建时看到相关日志。
答案 0 :(得分:1)
我建议redirect System.out to slf4j。这样,可以以标准化的常规方式在日志记录框架中配置所有日志记录。
请注意,根据您用来进行重定向的库,如果您有一些记录器打印到标准输出,您可能需要carefully configure it以便不会结束一个无限循环,打印的消息被重定向到日志记录,被重定向到打印消息,等等。
另请注意,大多数构建环境& IDE支持在生成日志文件时查看日志文件的内容,因此如果您不想,则不必将任何内容打印到标准输出。
答案 1 :(得分:0)
重定向System.out和System.err。
但要小心:如果您使用Simple Logger将会有一个递归
stdout
和stderr
将重定向到我们自己的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);
}
}));