一、前言
直接用logger.info("異常信息為:"+e)或者logger.info(e.getMessage())只能記錄到異常的描述信息,卻沒有其異常具體發生在哪一行代碼。
這樣即使通過日志發現出現了異常,也沒法馬上定位問題。
因此就催生了一個想法,打印日志是否能像在IDE本地跑程序時出現未捕獲的異常時,控制台能打印出完整的錯誤堆棧信息。
二、問題場景
日常開發中,經常在service實現層使用try-catch-finally保證代碼的健壯性, 直接用logger.info("異常信息為:"+e)或者logger.info(e.getMessage())只能記錄到異常的描述信息,無法打印完整異常堆棧信息,無法定位其異常具體發生在哪一行代碼,當面對比較復雜的代碼,那么排查問題將會非常麻煩。
直接用e.printStackTrace();
這種方式很占內存空間,尤其生產環境不能過多使用。
並且這種方式只是控制台打印,日志文件中不打印。
正確方法
@GetMapping("/hello")
public String sayHello(){
logger.info("hello Sfl4j + logback......");
try{
int i=3/0;
}catch(Exception e){
logger.error("錯誤消息:{}",e.getMessage(),e);
}
return helloService.sayHello();
}
}
小結:
1、Slf4j打印異常堆棧信息使用:
logger.error(String msg, Throwable t);------>logger.error(e.getMessage(),e);
logger.error(e);
或者
logger.info(String msg, Throwable t);------>logger.info(e.getMessage(),e);
規范示例:
logger.error("錯誤消息:{}",e.getMessage(),e);
@Slf4j
log.error("錯誤消息:{}",e.getMessage(),e);
2、異常信息Exception e 的相關方法
- e.toString():獲得異常類型和錯誤信息描述
- e.getMessage():獲得錯誤信息描述
- e.printStackTrace():在控制台打印出異常堆棧(異常類型、錯誤信息描述和出錯位置等)。