天天看點

列印錯誤日志使用toString/getMessage等方法的差別

這裡用最簡單的記憶體溢出的錯誤來測試:

/**
 * 測試JAVA的記憶體溢出問題
 */
public class MemoryDemo {

    private static final Logger logger = LoggerFactory.getLogger(MemoryDemo.class);

    private int index = 1;

    public void method(){
        index++;
        //嵌套方法
        method();
    }

    @Test
    public void test(){
        try {
            method();
        } catch (StackOverflowError e) {
            System.out.println("程式所需要的棧大小 > 允許最大的棧大小,執行深度: " + index);
            logger.error(e.toString());
            logger.error(e.getMessage());
            logger.error("調用method方法出錯",e);
        }
    }
}           

那麼這三種方法:

1、logger.error(e.toString());

程式所需要的棧大小 > 允許最大的棧大小,執行深度: 18898
16:07:40.490 [main] ERROR com.memory.MemoryDemo - java.lang.StackOverflowError           

2、logger.error(e.getMessage());

程式所需要的棧大小 > 允許最大的棧大小,執行深度: 18670
16:08:17.131 [main] ERROR com.memory.MemoryDemo - null           

3、logger.error(“調用method方法出錯”,e);

程式所需要的棧大小 > 允許最大的棧大小,執行深度: 18510
16:09:08.457 [main] ERROR com.memory.MemoryDemo - 調用method方法出錯
java.lang.StackOverflowError: null
    at com.memory.MemoryDemo.method(MemoryDemo.java:19) ~[classes/:na]
    at com.memory.MemoryDemo.method(MemoryDemo.java:19) ~[classes/:na]
    at com.memory.MemoryDemo.method(MemoryDemo.java:19) ~[classes/:na]
    at com.memory.MemoryDemo.method(MemoryDemo.java:19) ~[classes/:na]
    at com.memory.MemoryDemo.method(MemoryDemo.java:19) ~[classes/:na]