检索要打印到控制台的所有堆栈跟踪的内容?

时间:2016-12-23 19:10:18

标签: java logging exception-handling

我想单独记录我遇到的每一个独特错误,因为搜索十几个日志文件,每个 + 10k 行的长度是浪费时间和乏味的时间。

我抓住了所有可能的例外情况,但是其他线程或库通常会在没有任何方法自己处理它们的情况下发现自己的错误。

这有什么解决方法吗?

(E.G。调用printStackTrace()时的事件。)

2 个答案:

答案 0 :(得分:0)

思考的食物:

public class DemoClass {

    private Map<String, Exception> myExceptions = new HashMap<>();

    public void demoMethod() {
        try {
            // throwing an exception for illustration
            throw new IOException("some message");
        } catch (IOException e) {
            myExceptions.putIfAbsent(e.getLocalizedMessage(), e);

            // actually handle the exception
            ...
        }
    }

    public void finished() {
        for (Exception e : myExceptions.values()) {
            e.printStackTrace();
        }
    }
}

您可以存储尚未见过的任何例外情况。如果您的特定方案允许更好的方法来确保您只保留一个例外,那么您应该优先考虑Exception.getLocalizedMessage()

答案 1 :(得分:0)

  

这有什么解决方法吗?   (E.G.调用printStackTrace()时的事件。)

Remap System.err拦截扔掉的人。如果您查看Throwable.printStackTrace()的源代码,您会看到它间接调用System.err.println(this);

例如:

import java.io.PrintStream;

public class SpyPrintStream extends PrintStream {

    public static void main(String[] args) {
        System.setErr(new SpyPrintStream(System.err));
        System.setOut(new SpyPrintStream(System.out));
        new Exception().printStackTrace();
    }

    public SpyPrintStream(PrintStream src) {
        super(src);
    }

    @Override
    public void println(Object x) {
        if (x instanceof Throwable) {
           super.println("Our spies detected "+ x.getClass().getName());
        }
        super.println(x);
    }
}

请记住,使用此代码存在各种问题,如果使用非标准流的流调用printStackTrace,则无法解决此问题。

如果你真的想要捕获所有异常,你总是可以深入研究java.lang.instrument

  

我抓住了所有可能的例外情况,但是其他线程或库通常会在没有任何方法自己处理它们的情况下发现自己的错误。

大多数库会将异常抛回调用者或​​使用日志记录框架。捕获异常或配置日志记录框架。

  

我想单独记录我所遇到的每一个独特错误,因为搜索十几个日志文件,每个长度为+ 10k行,浪费时间和繁琐。

日志框架包括处理此问题的选项。 DuplicateMessageFilter就是一个例子。