1. 程式人生 > >logback系統異常日誌寫入檔案

logback系統異常日誌寫入檔案

控制檯異常堆疊日誌寫檔案

 先上問題。使用logback 的朋友會發現一個問題。自己分好日誌型別,日誌也會按級別輸出相應的檔案。前提是我們自己呼叫了info(),error()等日誌輸出方法。但是這樣就存在一個問題就是非jdk檢測異常,也就是RunTime異常是無法try..catch 後輸出logger.error(e.getMessage())的,每次線上出異常查日誌就只有通過容器的控制檯日誌進行查詢,這樣就會加大時間成本。並且在每次的try catch都要調error會相當麻煩。 之前是想著把控制檯的輸出直接寫到檔案,這個方向不對。因為我們是無法直接切入控制檯物件的。直到發現了@ControllerAdvice 這個註解,從名字上可以看出大體意思是控制器增強。內部使用@ExceptionHandler、@InitBinder、@ModelAttribute註解的方法應用到所有的 @RequestMapping註解的方法。非常簡單,不過只有當使用@ExceptionHandler最有用。我們只需要新增一個類作全域性異常處理
。那麼所有的異常都會通過這個方法返回前臺,而我們的日誌也就可以在這裡植入了。
程式碼如下:
@ControllerAdvice
public class GlobalExceptionHandler {

    private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ResponseBody
    @ExceptionHandler(Exception.class)
    public Object handleException(Exception e) {
        logger
.error(ExceptionUtils.getFullStackTrace(e)); // 記錄錯誤資訊 String msg = e.getMessage(); if (msg == null || msg.equals("")) { msg = "伺服器出錯"; } JSONObject jsonObject = new JSONObject(); jsonObject.put("message", msg); return jsonObject; } }

下面我們模擬一個runtime異常。通過postMan呼叫後臺方法 1 / 0的操作,

同時我們看看生成的日誌檔案
時間和pid一一對應,生成日誌。這樣就可以方便的檢視系統異常的堆疊日誌了。 (logback日誌配置不在這裡細說)