一.日志作用
1.定位和發現問題
這是日志的主要用途,通過查看日志,我們可以定位問題發生的位置,從而快速的發現問題,分析問題.
2.系統監控
監控幾乎是一個成熟系統的標配,我們可以通過日志記錄這個系統的運行狀態,比如記錄方法的響應時間,響應狀態,通過設置不同的規則,超過閾值就進行報警.
3.數據采集
采集的數據可以作用在很多方面,比如數據統計,推薦排序.
- 數據統計:統計頁面的瀏覽量,訪客量,點擊量
- 推薦排序:購物/廣告/新聞等都設計到推薦排序,數據采集是推薦排序中必須要做的.
4.日志審計
安全審計是系統安全中非常重要的一部分. 通過系統日志分析,可以判斷一些非法攻擊/非法調用.
二.日志的使用
Spring Boot項目在啟動的時候默認就有日志輸出:
這個日志格式是這樣的:
它比我們通過System.out.print打印的日志多了很多信息.
那我們怎么打印自己寫的日志呢?
SpringBoot內置了日志框架Slf4j,我們可以在程序中調用Slf4j來輸出日志.
三.日志框架
Slf4j不同于其他的日志框架,它不是一個真正的日志實現,而是一個對日志框架制定的一種規范,標準,接口. 所以Slf4j并不能獨立使用,需要和具體的日志框架配合使用.
門面模式/外觀模式
門面模式,提供了一個統一的接口,用來訪問子系統中的一組接口,其主要特征是定義了?個?層接?, 讓?系統更容易使?.
Slf4j是門面模式的典型應用
門面模式的優點
1.減少了系統的相互依賴,實現了客戶端和子系統的耦合關系
2.提高了靈活性,簡化了客戶端對子系統的使用難度
3.提高安全性.靈活設方法的定訪問權限
四.SLF4J日志框架
Slf4j就相當于是其他日志框架的門面,可以理解為是提供?志服務的統?API接?
為什么要引入日志門面?
常見的日志框架有 log4j , logback , 一個程序常常需要不同的日志框架, 而不同的日志框架的API和配置文件不同, 如果多個日志框架共存,就要維護多套配置文件,而且如果更換日志框架,還必須修改代碼 , 這個過程很容易產生沖突 .
而如果引入日志門面,應?程序和?志框架(框架的具體實現)之間有了統?的API接?(???志框架 實現), 此時應?程序只需要維護?套?志?件配置, 且當底層實現框架改變時, 也不需要更改應?程序代碼.
Slf4j就是這個日志門面.
所以Slf4j不是一個真實的日志框架實現,是一個日志框架門面?, 具體實現是log4j/log4j/logback/jul?
門面模式只是slf4j使用的一種設計模式 , 還有其他的設計模式.
打印?志的步驟
1. 在程序中得到?志對象.
在程序中獲取?志對象需要使??志?? LoggerFactory
2.使??志對象輸出要打印的內容
?志對象的打印?法有很多種,我們可以先使? info() ?法來輸出?志
日志格式
日志級別
?志級別代表著?志信息對應問題的嚴重性, 為了更快的篩選符合?標的?志信息.
?志的級別從?到低依次為 : FATAL、ERROR、WARN、INFO、DEBUG、TRACE
級別越?, 收到的消息越少
? FATAL: 致命信息,表?需要?即被處理的系統級錯誤.
? ERROR: 錯誤信息, 級別較?的錯誤?志信息, 但仍然不影響系統的繼續運?.
? WARN: 警告信息, 不影響使?, 但需要注意的問題
? INFO: 普通信息, ?于記錄應?程序正常運?時的?些信息, 例如系統啟動完成、請求處理完成等.
? DEBUG: 調試信息, 需要調試時候的關鍵信息打印.
? TRACE: 追蹤信息, ?DEBUG更細粒度的信息事件(除?有特殊?意,否則請使?DEBUG級別替代)
?志級別的使?
?志級別是開發?員??設置的. 開發?員根據??的理解來判斷該信息的重要程度,類似公司管理, 通常由領導來判斷什么樣的事情需要匯報, 什么樣的事情不需要匯報.
針對這些級別, Logger 對象分別提供了對應的?法, 來輸出?志
日志對象名
通常使用源代碼的類名 , 也可以自定義.
這里寫了五種不同級別的日志信息
然而發現只打印了三條日志信息,debug和trace類型的并未打印.
這是由于日志的輸出級別默認是info級別,所以只會打印?于等于此級別的?志, 也就 是info, warn和error.
配置成debug模式后
debug日志可以打印; 但是trace優先級比debug低,不能打印.
日志配置
這里以配置properties文件為例.
1設置日志的級別
logging.level.root: debug | 配置根目錄下所有文件日志的級別 |
logging.level.包路徑 :debug | 配置某個包下文件日志的級別 |
2設置顏色(idea)
?第一步:打開Edit Configuration
第二步:添加這串
- -Dspring.output.ansi.enabled=ALWAYS
3日志持久化
數據保存在數據庫中,是一種持久化的方式
日志保存在文件中,也是一種持久化的方式
這里是日志保存在文件中,有兩種?式
1. 配置?志?件名
2. 配置?志的存儲?錄
logging.file.name | 可以是相對路徑,也可以是絕對路徑. 可以是路徑+文件名/ 單獨一個文件名(以當前目錄作為基準目錄) |
logging.file.path | 只能是目錄 比如var/log |
注意: logging.file.name 和 logging.file.path 兩個都配置的情況下, 只?效其?, 以 logging.file.name 為準.
比如將日志文件保存到aaa.log
4日志分割
修改日志格式
logging.pattern.console | 修改控制臺的日志格式 |
logging.pattern.file | 修飾文件的日志格式 |
日志的簡單寫法
使用注解@Slf4j的方式
配置項 | 說明 | 默認值 |
logging.logback.rollingpolicy.fil e-name-pattern | ?志分割后的?件名 格式 | ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
logging.logback.rollingpolicy.m ax-file-size | ?志?件超過這個? ?就?動分割 | ?10MB |
???
5配置?志格式
打印?志的格式, 也是?持配置的. ?持控制臺和?志?件分別設置
配置項 | 說明 | 默認值 |
logging.pattern.console | 控制臺? 志格式 | %clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MMdd'T'HH:mm:ss.SSSXXX}}){faint} %clr(${LOG_LEVEL_PATTERN:- %5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]) {faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx} |
logging.pattern.file | ?志?件 的?志格 式 | %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MMdd'T'HH:mm:ss.SSSXXX}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx} |
注意需要簡單配置一下, 讓idea?持控制臺顏?顯?,參考第二點.
更簡單的?志輸出
由于每個類都要使用LoggerFactory獲取日志對象,lombok給我們提供了 ?種更簡單的?式.
1. 添加 lombok 框架?持
2. 使? @slf4j 注解輸出?志。
@slf4j會提供一個日志對象log,直接使用就可以 .