SpringBoot日志
- 日志概述
- 日志使用
- 打印日志
- 獲取日志對象
- 使用日志對象打印日志
- 日志框架介紹
- 門面模式
- SLF4J框架介紹(simple logging facade for java)
- 日志格式說明
- 日志級別
- 日志級別的分類
- 日志級別的使用
- 日志配置
- 配置日志級別
- 日志持久化
- 配置日志文件的路徑和文件名
- 配置日志文件的保存路徑
- 配置日志文件分割
- 更簡單的日志輸出
日志概述
- 為什么要學習?志
?志對我們來說并不陌?, 從JavaSE部分, 我們就在使? System.out.print 來打印?志了. 通過打印?志來發現和定位問題, 或者根據?志來分析程序的運?過程.在Spring的學習中, 也經常根據控制臺的?志來分析和定位問題.
隨著項?的復雜度提升, 我們對?志的打印也有了更?的需求, ?不僅僅是定位排查問題.
?如需要記錄?些??的操作記錄(?些審計公司會要求), 也可能需要使??志來記錄??的?些喜好,把?志持久化, 后續進?數據分析等. 但是 System.out.print 不能很好的滿?我們的需求, 我們就需要使??些專??志框架(專業的事情交給專業的?去做)
日志使用
Spring Boot 項?在啟動的時候默認就有?志輸出,如下圖所?:
我們可以看到SpringBoot答應出來的日志卻少了很多信息
SpringBoot打印出來的日志有 日志時間 日志級別 線程 打印日志的位置 日志信息等
springboot內置了日志框架slf4j,我們可以直接在程序中調用slf4j來輸出日志
打印日志
打印日志的步驟:
- 在程序中得到日志對象
- 使用日志對象輸出要打印的內容
獲取日志對象
在程序中獲取?志對象需要使??志?? LoggerFactory,如下代碼所?:
public class LogController {private static Logger logger = LoggerFactory.getLogger(LogController.class);
}
LoggerFactory.getLogger需要傳遞一個參數,標識這個日志的名稱,這樣可以更清晰的直到是哪個類輸出的日志,當有問題時,可以更方便直觀的定位到問題類
使用日志對象打印日志
日志對象的打印方法有很多種,我們可以先使用info()方法來輸出日志
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LogController {private static Logger logger = LoggerFactory.getLogger(LogController.class);@RequestMapping("/log")public String logger(){logger.info("這是一段日志");return "打印日志";}
}
日志框架介紹
SLF4J不同于其他日志框架,他不是一個真正的日志實現,而是一個抽象層,對日志框架指定的一種規范,標準,接口,所有SLF4J并不能獨立使用,需要和具體的日志框架配合使用
門面模式
SLF4J是門面模式的典型應用
門面模式(Facade Pattern)是一種軟件設計模式,它提供了一個統一的接口,用來訪問子系統中的一群接口。這個模式通過創建一個高層接口,簡化了客戶端與子系統之間的交互,從而降低了系統之間的耦合度。
通常情況下,一個系統由多個子系統組成,每個子系統都有自己的接口和功能。而客戶端需要與這些子系統進行交互,這樣可能會導致客戶端代碼變得復雜,并且對系統的變化比較敏感。門面模式的出現正是為了解決這個問題。
通過門面模式,客戶端只需要和門面對象交互,而門面對象負責將請求委派給相應的子系統進行處理。這樣一來,客戶端就不需要了解子系統的具體實現細節,從而降低了客戶端和子系統之間的耦合度,同時也方便了對子系統的修改和維護。
總的來說,門面模式可以幫助簡化復雜系統的接口,提高系統的靈活性和可維護性,同時也能夠隱藏系統的復雜性,使客戶端更加容易使用。
門面模式主要包含兩種角色
外觀角色,也成為門面角色,系統對外的統一接口
子系統角色,可以同時有一個或多個SubSystem,每個SubSystem都不是一個單獨的類,而是一個類的集合,SubSystem并不知道Facade的存在,
SLF4J框架介紹(simple logging facade for java)
SLF4J就是其他日志框架的門面,SLF4J可以理解為是提供日志服務的統一API接口,并不涉及到具體的日志邏輯實現
不引入日志門面
常見的日志框架有log4j ,logback等 如果一個項目已經使用log4j,而你依賴的另一個類庫,假如依賴另一個日志框架logback,那么就需要吧logback也加進去
存在問題
- 不同的日志框架的API接口和配置文件不同,如果多個日志框架并存,那么不得不維護多套配置文件(這里的配置文件指的是用戶自定義的配置文件)
- 如果要更換日志框架,應用程序將不得不修改代碼,并且修改過程中可能會存在一些代碼沖突
- 如果引入的第三方框架,使用了多套,那就不得不維護多套配置
引入日志門面
引入日志門面框架后,應用程序和日志框架之間有了統一 的API接口,此時應用程序只需要維護一套日志文件配置,且當底層實現框架改變時,也不需要更改應用程序代碼
日志格式說明
從上圖可以看到,?志輸出內容元素具體如下:
- 時間?期:精確到毫秒
- ?志級別:ERROR, WARN, INFO, DEBUG 或TRACE
- 進程ID
- 線程名
- Logger名(通常使?源代碼的類名)
- ?志內容
日志級別
?志級別代表著?志信息對應問題的嚴重性, 為了更快的篩選符合?標的?志信息
日志級別的分類
在Spring框架中,日志級別通常遵循通用的日志級別標準,比如 SLF4J 或 Logback 中定義的日志級別。Spring框架本身并沒有定義自己的日志級別,而是使用這些通用的標準。以下是常見的日志級別:
TRACE:提供非常詳細的日志信息,通常用于調試,跟蹤程序執行過程中的細節。
DEBUG:用于輸出調試信息,用于輔助定位問題和調試程序。
INFO:提供一般性的運行時信息,表明應用程序正在運行。
WARN:表示潛在的問題,不會導致應用程序停止運行,但可能需要引起注意。
ERROR:用于指出雖然發生了錯誤,但仍然允許程序繼續運行。
FATAL:指出嚴重的錯誤,可能導致應用程序退出。
在配置Spring應用程序的日志級別時,可以通過配置文件(比如logback.xml或log4j2.xml)或者通過代碼來設置。一般來說,通過配置文件進行設置更為靈活,可以根據不同的包或類設置不同的日志級別。在Spring中,也可以通過Spring Boot的application.properties或application.yml文件來配置日志級別。
總的來說,通過合理設置日志級別,可以幫助開發人員了解應用程序的運行情況,快速定位問題,提高系統的可維護性和穩定性。
日志級別的使用
?志級別是開發?員??設置的. 開發?員根據??的理解來判斷該信息的重要程度
針對這些級別, Logger 對象分別提供了對應的?法, 來輸出?志
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LogController {private static Logger logger = LoggerFactory.getLogger(LogController.class);@RequestMapping("/log")public String logger(){logger.trace("這是一段trace日志");logger.debug("這是一段debug日志");logger.info("這是一段info日志");logger.warn("這是一段warn日志");logger.error("這是一段error日志");return "打印日志";}
}
SpringBoot 默認的?志框架是Logback, Logback沒有 FATAL 級別, 它被映射到 ERROR .
出現fatal?志,表?服務已經出現了某種程度的不可?, 需要需要系統管理員緊急介?處理. 通常情況下, ?個進程?命周期中應該最多只有?次FATAL記錄.
結果發現只打印了info,warn和error級別的日志
這與日志級別的配置有關,日志的輸出默認級別時info級別 ,所以只會打印大于等于此級別的日志,也就是info,warn和error
日志配置
上述是?志的使?, ?志框架?持我們更靈活的輸出?志, 包括內容, 格式等
配置日志級別
我們可以在配置文件application.yml中配置logging.level配置項即可
我們可以發現此時就可以打印出Debug級別的日志了
日志持久化
以上的?志都是輸出在控制臺上的, 然?在線上環境中, 我們需要把?志保存下來, 以便出現問題之后追溯問題. 把?志保存下來就叫持久化.
日志持久化的兩種方式
- 配置日志文件名
- 配置日志的存儲目錄
配置日志文件的路徑和文件名
yml配置文件配置
設置文件的文件名
配置日志文件的保存路徑
這種方式只能設置日志的路徑,文件名為固定的spring.log
注意:
logging.file.name 和 logging.file.path 兩個都配置的情況下, 只?效其?, 以logging.file.name 為準
配置日志文件分割
如果我們的?志都放在?個?件中, 隨著項?的運?, ?志?件會越來越?, 需要對?志?件進?分割
當然, ?志框架也幫我們考慮到了這?點, 所以如果不進?配置, 就??動配置
默認?志?件超過10M就進?分割
配置項 | 說明 | 默認值 |
---|---|---|
logging.logback.rollingpolicy.file-name-pattern | ?志分割后的?件名格式 | ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
logging.logback.rollingpolicy.max-file-size | ?志?件超過這個??就?動分割 | 10MB |
配置文件分割
yml配置
logging:logback:rollingpolicy:max-file-size: 1KBfile-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
- ?志?件超過1KB就分割(設置1KB是為了更好展?. 企業開發通常設置為200M, 500M等, 此處沒
有明確標準)- 分割后的?志?件名為: ?志名.?期.索引
更簡單的日志輸出
每次都使? LoggerFactory.getLogger(xxx.class) 很繁瑣, 且每個類都添加?遍, lombok給我們提供了?種更簡單的?式.
- 添加 lombok 框架?持
- 使? @slf4j 注解輸出?志。
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@Slf4j
@RestController
public class LogController {
// private static Logger logger = LoggerFactory.getLogger(LogController.class);@RequestMapping("/log")public String logger(){//此時對象名稱為固定的loglog.trace("這是一段trace日志");log.debug("這是一段debug日志");log.info("這是一段info日志");log.warn("這是一段warn日志");log.error("這是一段error日志");return "打印日志";}
}
我們可以發現 這個注解的生命周期只存在于源代碼階段
**代碼在經過編譯之后 自動為我們生成了Logger對象 **