java - 如何根据包有选择地将system.out重定向到文件

标签 java redirect logging

我的java程序使用lib A。 我的java程序使用System.out.print()。 lib A 也使用 System.out.print()。 但我只希望控制台显示我的程序中 system.out.print() 的输出。不希望控制台显示来自 lib A 的日志。 怎么做? 谢谢。

最佳答案

如果性能和可维护性不是问题,您可以通过创建一个打印流来过滤现有的 System.out 流,该打印流在执行任何操作之前检查调用者。下面是一些示例代码,可以帮助您继续操作,但您必须重写每个方法来检查调用者:

 public class PackagePrintStream extends PrintStream {

    public PackagePrintStream(OutputStream out, boolean autoFlush, String encoding) throws UnsupportedEncodingException {
        super(out, autoFlush, encoding);
    }

    @Override
    public void println(Object x) {
        /**
         * You have to override all of the PrintStream methods
         * not just println.
         */
        if (allow()) {
            super.println(x); 
        }
    }

    private boolean allow() {
        String cn = inferCaller().getClassName();
        return !cn.startsWith("lib.A"); //@todo use the right package name.
    }

    private boolean isPrintImplFrame(String cname) {
        return PackagePrintStream.class.getName().equals(cname);
    }

    private StackTraceElement inferCaller() {
        StackTraceElement stack[] = (new Throwable()).getStackTrace();
        int ix = 0;
        while (ix < stack.length) {
            StackTraceElement frame = stack[ix];
            String cname = frame.getClassName();
            if (isPrintImplFrame(cname)) {
                break;
            }
            ix++;
        }

        while (ix < stack.length) {
            StackTraceElement frame = stack[ix];
            String cname = frame.getClassName();
            if (!isPrintImplFrame(cname)) {
                return frame;
            }
            ix++;
        }

        return new StackTraceElement(PackagePrintStream.class.getName(), "write",
                PackagePrintStream.class.getName(), -1);
    }
}

然后要安装流,请执行以下操作:

System.setOut(new PackagePrintStream(System.out, true, "UTF-8"));

关于java - 如何根据包有选择地将system.out重定向到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32274271/

相关文章:

php - 如何使 PHP session GC Cron 保持沉默

c++ - 如何从库中读取标准错误?

java - 如何在不必实现接口(interface)方法的情况下使用它们?

java - 在运行时更改 JComboBox 的内容

asp.net - 将用户从编辑页面重定向回调用页面

java - 重定向输出以作为命令行的输入?

windows - 有没有办法从 Mac 跟踪远程 Windows 机器上的日志?

Java 服务器和 Android 客户端无法连接

java - 在 Android 上对共享库进行数字签名

javascript - 如何重定向到另一个网页?