如何不显示来自 3rd 方 jar 的标准输出并且只显示 slf4j 日志
How to not to show stdout from 3rd party jar and only show slf4j log
我正在使用第三方 jar,其中包含很多 System.out.println()
。我对那些消息不感兴趣。它还使用我感兴趣的 slf4j 日志。
那么如何过滤掉标准输出中的 System.out.println()
消息。有快速的方法吗?我试图避免编写任何脚本来解析整个日志并只保留相关的日志。我正在使用 maven。
我更愿意将 logger 日志作为 stdout 和 system.out 作为文件.. 这样我可以在构建环境中 运行 时看到相关日志。
重定向 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);
}
}));
我建议 redirect System.out to slf4j。这样,所有日志记录都可以在您的日志记录框架中以标准化的正常方式配置。
请注意,根据您用于重定向的库,如果您有一些记录器打印到标准输出,您可能需要 carefully configure it 这样您就不会陷入无限循环,其中打印的消息被重定向到日志记录,日志记录被重定向到打印消息,依此类推。
另请注意,大多数构建环境和 IDE 都支持在生成日志文件时查看其内容,因此如果您不想,则不必将任何内容打印到标准输出。
我正在使用第三方 jar,其中包含很多 System.out.println()
。我对那些消息不感兴趣。它还使用我感兴趣的 slf4j 日志。
那么如何过滤掉标准输出中的 System.out.println()
消息。有快速的方法吗?我试图避免编写任何脚本来解析整个日志并只保留相关的日志。我正在使用 maven。
我更愿意将 logger 日志作为 stdout 和 system.out 作为文件.. 这样我可以在构建环境中 运行 时看到相关日志。
重定向 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);
}
}));
我建议 redirect System.out to slf4j。这样,所有日志记录都可以在您的日志记录框架中以标准化的正常方式配置。
请注意,根据您用于重定向的库,如果您有一些记录器打印到标准输出,您可能需要 carefully configure it 这样您就不会陷入无限循环,其中打印的消息被重定向到日志记录,日志记录被重定向到打印消息,依此类推。
另请注意,大多数构建环境和 IDE 都支持在生成日志文件时查看其内容,因此如果您不想,则不必将任何内容打印到标准输出。