日志记录异常堆栈详细信息

一、背景

在记录日志时,使用e.getMessage()获取异常信息时,经常会得到异常信息为null的情形,这对问题定位不仅起不到辅助作用,还会对问题排查造成困扰。如果能找到一种记录异常信息堆栈的方式,把e.printStackTrace()信息都打印出来,在问题定位时就比较方便了。通过本文介绍的方式,即可实现记录异常堆栈的详细信息。

本文中方法适合不支持Apache log4j打印日志开发平台。

二、详细代码

public class jdkTest {
    private static Logger log = Logger.getLogger(jdkTest.class);

    static String eDetail = "";
    static String eMsg = "";
    public static void main(String[] args) throws Exception {
        try{
            throw new Exception("");
        }catch(Exception e){
            //打印控制台堆栈信息,做为对比
            log.error("e.printStackTrace()控制台异常堆栈信息:");
            e.printStackTrace();
            //method 1
            eDetail = collectExceptionStackMsg(e);
            //methon 2
            eMsg = e.getMessage();
        }
        log.error("方式一,程序异常,详细堆栈信息为:\r\n" + eDetail);
        log.error("方式二,程序异常,异常信息为:" + eMsg);
    }

    /**
     * 收集异常堆栈信息
     * */
    public static String collectExceptionStackMsg(Exception e){
        StringWriter sw = new StringWriter();   
        e.printStackTrace(new PrintWriter(sw, true));   
        String strs = sw.toString();
        return strs;
    }
}

三、运行结果

[ERROR] 2017-05-14 11:03:10 [main] (jdkTest.java:36) e.printStackTrace()控制台异常堆栈信息:
java.lang.Exception: 
    at test.jdkTest.main(jdkTest.java:33)

[ERROR] 2017-05-14 11:03:10 [main] (jdkTest.java:43) 方式一,程序异常,详细堆栈信息为:
java.lang.Exception: 
    at test.jdkTest.main(jdkTest.java:33)

[ERROR] 2017-05-14 11:03:10 [main] (jdkTest.java:44) 方式二,程序异常,异常信息为:

你可能感兴趣的:(Language)