首頁 > 軟體

Spring Boot紀錄檔的列印與持久化詳細解析

2022-07-19 14:02:24

1. 紀錄檔有什麼用

紀錄檔是程式的重要組成部分,想象一下,如果程式報錯了,不讓你開啟控制檯看紀錄檔,那麼你能找到報錯的原因嗎?

答案是否定的,寫程式不是買彩票,不能完全靠猜,因此紀錄檔對應我們來說,最重要的用途就是排除和定位問題。

除了發現和定位問題之外,我們還可以通過紀錄檔實現以下功能:

  • 記錄使用者登入紀錄檔,方便分析使用者正常登入還是惡意破解使用者
  • 記錄系統的操作紀錄檔,方便資料恢復和定位元運算人
  • 記錄程式的執行實現,方便以後優化程式提供資料支援

2. 紀錄檔怎麼用

Spring Boot 專案在啟動的時候預設就有紀錄檔輸出,如下圖所示:

以上內容就是 Spring Boot 輸出的控制檯紀錄檔資訊。

通過上述紀錄檔資訊我們可以發現以下3個問題:

  • Spring Boot 內建了紀錄檔框架(不然也輸出不了紀錄檔)
  • 預設情況下,輸出的⽇志並⾮是開發者定義和列印的,那開發者怎麼在程式中⾃定義列印⽇志呢?
  • ⽇志預設是列印在控制檯上的,⽽控制檯的⽇志是不能被儲存的,那麼怎麼把⽇志永久的儲存下來 呢?

下面我們一起來找尋這些問題的答案。

3. Spring Boot 自定義紀錄檔的列印

  • 在一個類中先獲取到列印紀錄檔物件(紀錄檔框架提供的紀錄檔物件,而紀錄檔框架預設已經整合到 Spring Boot 裡了)
  • 使用紀錄檔物件提供的方法實現紀錄檔的列印

3.1 先獲取到列印紀錄檔物件

在程式中獲取紀錄檔物件需要使用紀錄檔工廠 LoggerFactory,如下程式碼所示:

 // 1.先得到紀錄檔物件(來自 slf4j)
    private static final Logger log =
            LoggerFactory.getLogger(UserController.class);

紀錄檔工廠需要將每個類的型別傳遞進去,這樣我們才知道紀錄檔的歸屬類,才能更方便,更直觀的定位到問題類。

注意:Logger 物件是屬於 org.slf4j 包下的,不要匯入錯誤。

因為 Spring Boot 中內建了紀錄檔框架 slf4j,所以 咋們可以直接在程式中呼叫 slf4j 來輸出紀錄檔

3.2 使用紀錄檔物件列印紀錄檔

紀錄檔物件的列印方法有很多,我們可以先使用 info() 方法來輸出紀錄檔,如下程式碼所示:

// 2.使用紀錄檔物件提供的列印方法進行紀錄檔列印
        log.trace("我是 trace");
        log.debug("我是 debug");
        log.info("我是 info");
        log.warn("我是 warn");
        log.error("我是 error");

列印效果展示:

3.3 紀錄檔格式說明

4. 紀錄檔級別

5. 紀錄檔持久化(將紀錄檔永久的儲存到磁碟的某個位置)

以上的⽇志都是輸出在控制檯上的,然⽽在⽣產環境上咱們需要將⽇志儲存下來,以便出現問題之後追 溯問題,把⽇志儲存下來的過程就叫做持久化。

想要將⽇志進⾏持久化,只需要在設定⽂件中指定⽇志的儲存⽬錄或者是指定⽇志儲存⽂件名之後, Spring Boot 就會將控制檯的⽇志寫到相應的⽬錄或⽂件下了。

設定紀錄檔的儲存路徑

在組態檔中,輸入如下程式碼:

# 設定紀錄檔的儲存路徑
# 正確設定紀錄檔路徑的方式1
logging.file.path=D:/JavaCode/
# 正確設定紀錄檔路徑的方式2
logging.file.path=D:\JavaCode\

儲存後:

注意:

logging.file.path=D:JavaCode

這種寫法,Spring Boot 會認為是一個特殊字元,而非目錄,所以紀錄檔持久化不會成功。

6. 更簡單的紀錄檔輸出—lombok

每次都使用 LoggerFactory.getLogger(xxx.class) 很繁瑣,而且每個類都要新增一遍,也很麻煩,這裡有種更好的紀錄檔輸出方式,使用 lombok 來更簡單的輸出。

  • 新增 lombok 框架支援
  • 使用 @slf4j 註解輸出紀錄檔

6.1 新增 lombok 到當前專案

1.在 pom.xml 中先刪除已有的 lombok 依賴

2.下載外掛

下載好之後,手動引入 lombok 依賴

6.2 使用 @Slf4j 得到紀錄檔物件 log

@Controller
@ResponseBody
@Slf4j // 替代了之前需要通過 LoggerFactory.getLogger 操作
public class UserService {
        @RequestMapping("/sayhi2")
        public void sayHi2() {
                log.trace("我是 trace");
                log.debug("我是 debug");
                log.info("我是 info");
                log.warn("我是 warn");
                log.error("我是 error");
        }
}

控制檯列印結果如下:

總結

⽇志是程式中的重要組成部分,使⽤⽇志可以快速的發現和定位問題,Spring Boot 內容了⽇志框架, 預設情況下使⽤的是 info ⽇志級別將⽇志輸出到控制檯的,我們可以通過 lombok 提供的 @Slf4j 註解 和 log 物件快速的列印⾃定義⽇志,⽇志包含 6 個級別:

  • trace:微量,少許的意思,級別最低;
  • info:普通的列印資訊;
  • debug:需要偵錯時候的關鍵資訊列印;
  • warn:警告,不影響使⽤,但需要注意的問題;
  • error:錯誤資訊,級別較⾼的錯誤⽇志資訊;
  • fatal:致命的,因為程式碼異常導致程式退出執⾏的事件。

⽇志級別依次提升,⽽⽇志界別越⾼,收到的⽇志資訊也就越少,我們可以通過設定⽇志的儲存名稱或 儲存⽬錄來將⽇志永久地儲存下來。

到此這篇關於Spring Boot紀錄檔的列印與持久化詳細解析的文章就介紹到這了,更多相關Spring Boot紀錄檔內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com