簡體   English   中英

log4j:一次記錄多個異常?

[英]log4j: log multiple exceptions at once?

我有一些類似以下的代碼:

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 ,而只希望收到一封與此有關的電子郵件。

這是簡單干凈的方法:

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);
    }
}

我一直在搞弄它,我能夠將列表中每個Exception的堆棧跟蹤組合在一起,以傳遞到新的自定義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)

如果您不希望堆棧跟蹤異常,則可以遍歷該列表,並在日志語句中為每個異常調用getMessage(或getLocalisedMessage)方法。 那應該打印出異常的類型以及原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM