目錄
- 一、日志概述
- 二、使用日志
- 2.1 打印日志
- 2.2 日志框架
- 2.2.1 門面 / 外觀 模式
- 2.3 日志級別
- 2.3.1 六大分類
- 2.3.2 使用
- 2.4 日志級別配置
- 2.5 日志的持久化
- 2.6 日志文件分割
- 2.7 日志文件格式
- 2.8 @Slf4j 簡單打印日志

一、日志概述
?志主要是為了發現問題, 分析問題, 定位問題的, 但除此之外, ?志還有很多?途,像監控程序,當程序出現什么問題時,在日志中反應為相對應的日志,然后可以提醒程序猿。日志還可以記錄數據,用于分析等等。
二、使用日志
我們先簡單看一下一個Spring的日志包含的內容:
2.1 打印日志
我們在程序中打印SpringBoot的日志,我們先要拿到日志對象,在import org.slf4j
包下的Logger對象。在從這個包下的靜態類日志工廠 LoggerFactor拿到實例 。
private Logger logger = LoggerFactory.getLogger(LogController.class);
在通過Logger類中的info方法打印日志。
package com.example.captcha.Controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/log")
@RestController
public class LogController {private final static Logger LOGGER = LoggerFactory.getLogger(LogController.class);@RequestMapping("/print")public String print() {LOGGER.info("日志");return "日志";}
}
得到的日志:
2.2 日志框架
在我們使用Logger類的時候,會有很多包。
這幾個包的關系如下:
以電視機和遙控器來舉例子,日志實現就相當于不同品牌的電視,而日志門面就相當于一個 通用的遙控器。
2.2.1 門面 / 外觀 模式
門面模式:
??模式(Facade Pattern)?稱為外觀模式, 提供了?個統?的接?, ?來訪問?系統中的?群接口. 其主要特征是定義了?個?層接?, 讓?系統更容易使?.
??模式主要包含2種??:
外觀??(Facade): 也稱????,系統對外的統?接?.?系統??(SubSystem): 可以同時有?個或多個 SubSystem. 每個 SubSytem都不是?個單獨的類, ?是?個類的集合. SubSystem 并不知道 Facade的存在, 對于 SubSystem ??, Facade 只是另?個客?端?已(即 Facade 對 SubSystem 透明)
2.3 日志級別
2.3.1 六大分類
?志的級別從?到低依次為: FATAL、ERROR、WARN、INFO、DEBUG、TRACE
- FATAL: 致命信息,表?需要?即被處理的系統級錯誤.
- ERROR: 錯誤信息, 級別較?的錯誤?志信息, 但仍然不影響系統的繼續運?.
- WARN: 警告信息, 不影響使?, 但需要注意的問題
- INFO: 普通信息, ?于記錄應?程序正常運?時的?些信息,例如系統啟動完成、請求處理完成等.
- DEBUG: 調試信息, 需要調試時候的關鍵信息打印.
- TRACE: 追蹤信息, ?DEBUG更細粒度的信息事件(除?有特殊?意,否則請使?DEBUG級別替代)
2.3.2 使用
對于不同級別的日志,SpringBoot的Logger類下面有對應名字的方法(FATAl)除外。
SpringBoot 默認的?志框架是Logback, Logback沒有 FATAL 級別, 它被映射到 ERROR .出現fatal?志,表?服務已經出現了某種程度的不可?, 需要需要系統管理員緊急介?處理. 通常情況下, ?個進程?命周期中應該最多只有?次FATAL記錄.
package com.example.captcha.Controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/log")
@RestController
public class LogController {private final static Logger LOGGER = LoggerFactory.getLogger(LogController.class);@RequestMapping("/print")public String print() {//LOGGER.info("日志");LOGGER.trace("trace級別日志");LOGGER.debug("debug級別日志");LOGGER.info("info級別日志");LOGGER.warn("ware級別日志");LOGGER.error("error級別日志");return "日志";}
}
上訴代碼的結果如下:
只會顯示info級別及其以上級別的日志,這是因為Spring在默認的配置下是顯示info級以上級別日志。
2.4 日志級別配置
我們只需要在配置文件加上:logging.level.目錄
就可以配置相對應目錄下的日志顯示級別。
如果我們在配置文件中加上這樣的配置信息
logging:level:com:example:captcha:Controller: trace
那么我們打印的日志就會變成下面的這樣:
2.5 日志的持久化
日志如果不進行配置,默認?志都是輸出在控制臺上的, 然?在線上環境中, 我們需要把?志保存下來, 以便出現問題之后追溯問題.把?志保存下來就叫持久化。
我們就可以將日志寫入文件。
Spring中有以下兩個配置項,來配置日志寫入的文件。
- logging.file.name配置項,可以包含文件的路徑和文件名。
- logging.file.path配置項,只能包含文件路徑。
- 當兩個配置項同時存在的時候,只有logging.file.name會有作用。
我們進行如下配置:
logging:file:name: logger/log.logpath: all
得到如下結果:
2.6 日志文件分割
日志文件分割有以下兩個相關的配置項:
- logging.logback. rolling policy.max-file-size配置項,用于配置每個文件的大小。
- logging.logback. rolling policy.file-name-pattern配置項,用于配置每個文件的名字及其格式。
我們寫下如下配置:
logging:logback:rolling policy:max-file-size: 1KBfile-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
結果就如下:
注意事項:
- logging.logback. rolling policy.max-file-size配置項,并不是嚴格的每個文件都不會超過配置的大小,而是按照必須將當前的日志行寫完才分割。
- logging.logback. rolling policy.file-name-pattern配置項,默認格式
${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
2.7 日志文件格式
日志文件格式分割有以下兩個相關的配置項:
配置項 | 說明 |
---|---|
logging.pattern.console | 控制臺?志格式 |
logging.pattern.file | ?志?件的?志格式 |
配置項說明:
- %clr(表達式){顏?}設置輸??志的顏?。支持blue cyan faint green magenta red yellow
- %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd’T’HH:mm:ss.SSSXXX}} ?期和時間–精確到毫秒
- %5p 顯??志級別ERROR,MARN,INFO,DEBUG,TRACE.
- %t 線程名.
- %c 類的全限定名.
- %M method.
- %L 為?號.
- %thread 線程名稱.
- %m 或者%msg 顯?輸出消息.
- %n 換?符
- %5 若字符?度?于5,則右邊?空格填充.
- %-5 若字符?度?于5,則左邊?空格填充.
- %.15 若字符?度超過15,截去多余字符.
- %15.15 若字符?度?于15,則右邊?空格填充.若字符?度超過15,截去多余字符
2.8 @Slf4j 簡單打印日志
我們可以使用lombok提供的@Slf4j注解來打印日志,這個注解的作用相當于就是sping幫我們創建Logger對象,對象名為log。
例如下面代碼:
package com.example.captcha.Controller;import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/log")
@RestController
@Slf4j
public class LogController {@RequestMapping("/print")public String print() {//LOGGER.info("日志");log.trace("trace級別日志");log.debug("debug級別日志");log.info("info級別日志");log.warn("ware級別日志");log.error("error級別日志");return "日志";}
}
結果如下: