【问题标题】:log4j2 - configure stderr redirect/ignore for specific packagelog4j2 - 为特定包配置标准错误重定向/忽略
【发布时间】:2019-03-29 01:24:29
【问题描述】:

我在测试中使用了第 3 方库。 该库将异常打印到标准错误并显示在控制台中。

我想做的就是忽略它们。

我能够编写一个 java-hack 代码来拦截标准错误

System.setErr(new PrintStream(new OutputStream() { public void write(int b) { } }));

但这会在运行 junit 时禁用所有标准错误 - 我只想从特定包中禁用标准错误。

我的 junit 有一个 log4j2-test.xml,但我找不到任何示例来说明如何在 包级别控制标准错误。

有什么想法吗?

【问题讨论】:

    标签: java logging junit log4j2 stderr


    【解决方案1】:

    解决此问题的一种比较欺骗性的方法是为错误流提供您自己的实现。然后,此错误流在内部创建一个异常,并使用它来查看原始异常的打印位置。这肯定是滥用异常。

    一个“简单”的实现是:

        System.setErr(new PrintStream(new OutputStream() {
            @Override
            public void write(byte[] b, int off, int len) throws IOException {
                Exception e = new Exception();
                StackTraceElement[] elements = e.getStackTrace();
                boolean hasSeenPrintStackTrace = false;
                for (int i = 0; i < elements.length; i++) {
                    if (
                        elements[i].getClassName().equals("java.lang.Throwable") &&
                        elements[i].getMethodName().equals("printStackTrace")
                    ) {
                        hasSeenPrintStackTrace = true;
                    } else {
                        if (hasSeenPrintStackTrace) {
                            if (
                                elements[i].getClassName().equals("me.ferrybig.testpackage.ExceptionTester") &&
                                elements[i].getMethodName().equals("log1")
                            ) {
                                return;
                            }
                        }
                    }
                }
                System.out.write(b, off, len);
            }
    
            @Override
            public void write(byte[] b) throws IOException {
                // TODO copy above implementation to here, exceptions printing only seems to use the above method
                System.out.write(b);
            }
            public void write(int b) {
                // TODO copy above implementation to here, exceptions printing only seems to use the above method
                System.out.write(b);
            }
        }));
    

    上面的代码基本上遵循所有堆栈跟踪元素,直到找到java.lang.Throwable类和printStackTrace方法。从那时起,它会设置一个布尔标志,因此它可以检查其后面的 所有 帧,并扫描这些帧是否包含某个类和方法组合。然后将其用于过滤写入调用,因此它不会出现在最终输出中。

    完整演示课程:http://tpcg.io/5xnlZ7

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      相关资源
      最近更新 更多