log4j:一次记录多个异常?

时间:2015-09-15 17:38:29

标签: java log4j

我有一些代码如下:

List<Exception> exceptions = new ArrayList<Exception>();
for (Foo foo : foos) {
     try {
        doStuff(foo);
     } catch (FooException ex) {
        exceptions.add(ex);
     }
}
if (!exceptions.isEmpty())
   logger.error("Exceptions occurred processing foos", exceptions);

在我的日志中,我会看到每个异常的完整详细信息,包括堆栈跟踪,原因链等。当然,这段代码实际上并不起作用。有没有办法获得它,所以一个日志条目包含所有这些?

至于为什么不记录每个异常,因为它被抓住了,原因是我正在使用SMTPAppender而宁愿只收到一封关于此事件的电子邮件。

3 个答案:

答案 0 :(得分:3)

这很简单&amp;干净的方式:

1。创建自己的例外:

class CompositeException extends Exception {
    private final List<Exception> es;

    public CompositeException(Exception[] es) {
        this.es = Arrays.asList(es);
    }

    public CompositeException(List<Exception> es) {
        this.es = new ArrayList<Exception>(es);
    }

    @Override
    public void printStackTrace(PrintStream s) {
        for (Throwable e : this.es) {
            e.printStackTrace(s);
        }
    }
}

2。然后使用CompositeException类:

List<Exception> exceptions = new ArrayList<Exception>();
for (Foo foo : foos) {
    try {
        doStuff(foo);
    } catch (FooException ex) {
        exceptions.add(ex);
    }
}

答案 1 :(得分:1)

我一直在搞乱它,我能够将列表中每个Exception的堆栈跟踪组合成一个新的自定义异常:

public class MyException extends Exception {

    public static void main(String[] args) throws MyException {

        StringWriter errors = new StringWriter();

        List<Exception> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            try {
                divideByZero(i);
            } catch (Exception e) {
                e.printStackTrace(new PrintWriter(errors));
            }
        }

        if (!errors.toString().isEmpty()) {
            throw new MyException(errors.toString());
        }
    }

    public MyException(String message) {
        super (message);
    }

    public static int divideByZero(int i) {
       return i/0;
    }
}

这是一个非常人为的例子,但我只想传达我的想法......如果你愿意的话,你可以调整/改进它以包含更多信息。

这印刷了以下内容:

Exception in thread "main" MyException: java.lang.ArithmeticException: / by zero
    at MyException.divideByZero(MyException.java:34)
    at MyException.main(MyException.java:24)
java.lang.ArithmeticException: / by zero
    at MyException.divideByZero(MyException.java:34)
    at MyException.main(MyException.java:24)
java.lang.ArithmeticException: / by zero
    at MyException.divideByZero(MyException.java:34)
    at MyException.main(MyException.java:24)

    at MyException.main(MyException.java:30)

答案 2 :(得分:0)

如果您不想要异常的堆栈跟踪,则可以遍历列表并在日志语句中为每个异常调用getMessage(或getLocalisedMessage)方法。这应该打印出异常的类型以及原因。