Log4j打印异常堆栈信息到日志

2016-04-15 Eric Wang 更多博文 » 博客 » GitHub »

Log4j

原文链接 http://codepub.cn/2016/04/15/Log4j-print-exception-stack-information-to-the-log/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


把辛勤的耕作当做生命的必要,即使没有收获的指望依然心平气和的继续耕种。

路遥

Java中,通常情况下,需要将异常堆栈信息输出到日志中,这样便于纠错及修正Bug,而多数情况下,大家最常用的是使用e.printStackTrace()直接打印堆栈信息完事,这并不是值的推荐的做法。

1. 当出现异常时,调用e.printStackTrace();其实相当于什么都没做,同时也不会把异常信息输出到日志文件中 2. 使用log.error(e.getMessage());只能够输出异常信息,但是并不包括异常堆栈,所以无法追踪出错的源点 3. 使用log.error(e);除了输出异常信息外,还能输出异常类型,但是同样不包括异常堆栈,该方法doc说明为:Logs a message object with the ERROR level.显然并不会记录异常堆栈信息 4. 当然也可以自己手动写个工具类,来挨个输出e.getStackTrace();获得的堆栈信息,显然繁琐麻烦 5. 其实在log4j中只需要这样调用,就可以获得异常及堆栈信息log.error(Object var1, Throwable var2);,该方法doc说明为:Logs a message at the ERROR level including the stack trace of the Throwable t passed as parameter.

例如:

    @Test
    public void testError() {
        String s = null;
        try {
            s.length();
        } catch (Exception e) {
            log.error(s, e);
            //当然如果你懒得想提示信息的话,直接这样log.error("", e);
        }
    }

输出:

2016.04.14 12:41:56 GMT+08:00 ERROR XX XX testError - null java.lang.NullPointerException at XX(XX.java:YY) [classes/:?] ...... ......