Spring Boot 日志級(jí)別及配置詳解
為什么要學(xué)習(xí)日志
最主要的原因就是發(fā)現(xiàn)和定位問(wèn)題,或者根據(jù)日志來(lái)分析程序的運(yùn)行過(guò)程。隨著項(xiàng)目的復(fù)雜度提升,我們對(duì)日志的打印也有了更高的需求,而不僅僅是定位排查問(wèn)題
比如需要記錄一些用戶的操作記錄(一些審計(jì)公司會(huì)要求),也可能需要使用日志來(lái)記錄用戶的一些喜好,把日志持久化,方便后續(xù)進(jìn)行數(shù)據(jù)分析等。也可以通過(guò)日志記錄這個(gè)系統(tǒng)的運(yùn)行狀態(tài),每一個(gè)方法的響應(yīng)時(shí)間,響應(yīng)狀態(tài)等,設(shè)置不同的規(guī)則,超過(guò)閾值時(shí)進(jìn)行報(bào)警
還有一些內(nèi)部的違規(guī)和信息泄漏(比如客戶信息被賣掉)現(xiàn)象出現(xiàn)后,如果未記錄留存日志,為事后調(diào)查提供依據(jù),那么后續(xù)很難追查(一些公司查看客戶信息的操作都會(huì)記錄日志,如果頻繁查詢也會(huì)報(bào)警)
日志使用
SpringBoot 內(nèi)置了日志框架 slf4j,我們可以直接調(diào)用 slf4j 來(lái)輸出日志
打印日志的步驟:
- 在程序中得到日志對(duì)象
- 使用日志對(duì)象輸出要打印的內(nèi)容
獲取日志對(duì)象需要使用 LoggerFactory,如下代碼所示:
private static final Logger logger = LoggerFactory.getLogger(XXX.class);
LoggerFactory.getLogger
需要傳遞一個(gè)參數(shù),標(biāo)識(shí)這個(gè)日志的名稱。這樣可以更清晰地知道是哪個(gè)類輸出的日志。當(dāng)有問(wèn)題時(shí),可以更方便直觀地定位到問(wèn)題類
注意 Logger 是屬于 org.slf4j 包下的,不要導(dǎo)錯(cuò)包
我們先使用 info () 方法來(lái)輸出日志,如下代碼所示:
import jakarta.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RestController; @RestController public class LogController { private static final Logger logger = LoggerFactory.getLogger(LogController.class); @PostConstruct public void logger() { System.out.println("打印日志"); logger.info("打印日志"); } }
打印日志效果展示:
可以看到 System.out.println 打印的日志,比 slf4j 打印的日志少了很多信息
日志級(jí)別
日志級(jí)別代表著日志信息對(duì)應(yīng)問(wèn)題的嚴(yán)重性, 為了更快地篩選符合目標(biāo)的日志信息
日志級(jí)別的分類
日志的級(jí)別從高到低依次為: FATAL、ERROR、WARN、INFO、DEBUG、TRACE
- FATAL:致命信息,表示需要立即被處理的系統(tǒng)級(jí)錯(cuò)誤
- ERROR:錯(cuò)誤信息,不影響系統(tǒng)的繼續(xù)運(yùn)行
- WARN:警告信息,不影響使用,但需要注意的問(wèn)題
- INFO:普通信息,用于記錄應(yīng)用程序正常運(yùn)行時(shí)的一些信息,例如系統(tǒng)啟動(dòng)完成、請(qǐng)求處理完成等
- DEBUG:調(diào)試信息,需要調(diào)試時(shí)候的關(guān)鍵信息打印
- TRACE:追蹤信息,比 DEBUG 更細(xì)粒度的信息事件 (除非有特殊用意,否則請(qǐng)使用 DEBUG 級(jí)別替代)
日志級(jí)別是開發(fā)人員自己設(shè)置的,根據(jù)開發(fā)人員自己的理解來(lái)判斷該信息的重要程度,和測(cè)試人員的 Bug 級(jí)別沒(méi)有關(guān)系
日志級(jí)別的使用
針對(duì)這些級(jí)別,Logger 對(duì)象分別提供了對(duì)應(yīng)的方法來(lái)輸出日志(除了fatal)
Spring Boot 默認(rèn)集成的日志框架是 Logback。同時(shí),Spring Boot 在日志方面還整合了 SLF4J(Simple Logging Facade for Java),SLF4J 并不是一個(gè)具體的日志實(shí)現(xiàn)框架,而是一個(gè)抽象的日志門面
SLF4J 提供了一套通用的接口規(guī)范,允許開發(fā)者在不修改應(yīng)用代碼中日志調(diào)用方式的前提下,靈活切換底層實(shí)際的日志實(shí)現(xiàn)框架,比如 Logback、Log4j 等。這就使得應(yīng)用程序在不同的部署環(huán)境或基于不同的需求,可以輕松地更換日志實(shí)現(xiàn),而無(wú)需大規(guī)模改動(dòng)代碼
在 Logback 中,雖然沒(méi)有獨(dú)立的 FATAL 日志級(jí)別,但由于 SLF4J 的存在,它可以將 SLF4J 定義的 FATAL 級(jí)別進(jìn)行映射處理。具體來(lái)說(shuō),Logback 把 SLF4J 中的 FATAL 級(jí)別映射到了 ERROR 級(jí)別。這意味著,即使通過(guò)其他方式調(diào)用 FATAL ,最終也會(huì)被映射為 ERROR 級(jí)別
通過(guò)這種映射機(jī)制,即使 Logback 自身沒(méi)有專門的 FATAL 級(jí)別,但依然能夠和基于 SLF4J 的日志體系很好地兼容
@RestController public class LogController { private static final Logger logger = LoggerFactory.getLogger(LogController.class); @PostConstruct public void printLog() { logger.error("error日志"); logger.warn("warn日志"); logger.info("info日志"); logger.debug("debug日志"); logger.trace("trace日志"); } }
發(fā)現(xiàn)只打印了error , warn 和 info 級(jí)別的日志。因?yàn)槿罩镜妮敵黾?jí)別默認(rèn)是 info ,如果不進(jìn)行任何配置,那么低于INFO級(jí)別的日志就不會(huì)打印
日志配置
配置日志級(jí)別
yml 配置
logging: level: root: debug
這樣會(huì)將 所有包(包括 Spring 框架內(nèi)部) 的日志級(jí)別都設(shè)置為 DEBUG,導(dǎo)致控制臺(tái)輸出大量框架層面的調(diào)試信息,影響排查效率
將 root 替換為自己代碼中需要打印 DEBUG 日志的包路徑,這樣僅會(huì)啟用指定包下的 DEBUG 日志,而 Spring 等其他依賴仍使用默認(rèn)級(jí)別(通常是 INFO)
如果需要對(duì)不同包設(shè)置不同級(jí)別,可以這樣配置:
logging: level: # 自定義業(yè)務(wù)包開啟 DEBUG 級(jí)別日志 org.example.j20250702: debug # Spring 框架內(nèi)部日志,只打印 INFO 及更高級(jí)別 org.springframework: info
配置日志持久化
以上的日志都是輸出在控制臺(tái)上的,然而我們常常需要把日志保存下來(lái),以便出現(xiàn)問(wèn)題之后追溯問(wèn)題。把日志保存下來(lái)就叫持久化
日志持久化有兩種方式
- 配置日志文件的路徑和文件名:
yml 配置
logging: file: name: logger/springboot.log
后面可以跟絕對(duì)路徑或者相對(duì)路徑
運(yùn)行結(jié)果顯示,日志內(nèi)容保存在了對(duì)應(yīng)的目錄下
- 配置日志文件的保存路徑:
yml 配置
logging: file: path: log
后面可以跟絕對(duì)路徑或者相對(duì)路徑,但只能設(shè)置日志的路徑,文件名固定為 spring.log
運(yùn)行程序,該路徑下多出一個(gè)日志文件: spring.log
logging.file.name 和 logging.file.path 兩個(gè)都配置路徑的情況下,只生效其一,以 logging.file.name 為準(zhǔn)
配置日志文件分割
如果我們的日志都放在一個(gè)文件中,隨著項(xiàng)目的運(yùn)行,日志文件會(huì)越來(lái)越大,所以有必要對(duì)日志文件進(jìn)行分割
當(dāng)然,日志框架也考慮到了這一點(diǎn),所以如果不進(jìn)行配置,默認(rèn)日志文件超過(guò) 10MB 就進(jìn)行分割
配置項(xiàng) | 說(shuō)明 | 默認(rèn)值 |
---|---|---|
logging.logback.rollingpolicy.file-name-pattern | 日志分割后的文件名格式 | ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
logging.logback.rollingpolicy.max-file-size | 日志文件超過(guò)這個(gè)大小就自動(dòng)分割 | 10MB |
yml配置日志文件分割:
logging: logback: rollingpolicy: file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i max-file-size: 1KB file: path: log
- 日志文件超過(guò) 1KB 就分割 (設(shè)置 1KB 是為了更好展示文件分割)
- 分割后的日志文件名為:日志名.日期.編號(hào)(每日重置)
配置日志打印格式
目前日志打印的格式是默認(rèn)的,我們可以進(jìn)行配置,而且支持控制臺(tái)和日志文件分別設(shè)置
配置項(xiàng) | 默認(rèn)值 |
---|---|
logging.pattern.console (控制臺(tái)日志格式) | %clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'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-MM-dd'T'HH:mm:ss.SSSXXX}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx} |
格式說(shuō)明:
%clr(表達(dá)式){顏色}
:設(shè)置輸入日志的顏色,支持顏色有以下幾種:blue、cyan、faint、green、magenta、red、yellow%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}
日期和時(shí)間 —— 精確到毫秒
%d{}
: 日期
${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}
:非空表達(dá)式,獲取系統(tǒng)屬性 LOG_DATEFORMAT_PATTERN
, 若不存在,則使用 yyyy-MM-dd HH:mm:ss.SSSXXX 格式,系統(tǒng)屬性可以通過(guò)System.getProperty("LOG_DATEFORMAT_PATTERN")
獲取
%p
顯示日志級(jí)別 ERROR,WARN,INFO,DEBUG,TRACE。%t
線程名。%c
類的全限定名。%M
方法名。%L
行號(hào)。%m
或者%msg
顯示輸出消息。%n
換行符。%5
表示如果字符長(zhǎng)度小于 5,則右邊用空格填充。%-5
表示如果字符長(zhǎng)度小于 5,則左邊用空格填充。%.15
表示如果字符長(zhǎng)度超過(guò) 15,截去多余字符。%15.15
表示如果字符長(zhǎng)度小于 15,則右邊用空格填充;若字符長(zhǎng)度超過(guò) 15,截去多余字符。
更多說(shuō)明,參考:https://logback.qos.ch/manual/layouts.html#conversionWord
yml配置
logging: pattern: console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %p %c %M %L [%t] %m%n' file: '%d{yyyy-MM-dd HH:mm:ss.SSS} %p %c %M %L [%t] %m%n'
項(xiàng)目運(yùn)行, 觀察日志變化:
通常情況下,咱們就使用默認(rèn)的日志打印格式即可
設(shè)置了顏色,卻沒(méi)有生效?
需要配置,讓 idea 支持控制臺(tái)顏色顯示。打開啟動(dòng)配置,添加 VM options
在 VM options 中添加 -Dspring.output.ansi.enabled=ALWAYS
應(yīng)用并重啟程序
使用lombok提供的注解
每個(gè)類都添加一遍LoggerFactory.getLogger(xxx.class)
很繁瑣,lombok 給我們提供了一種更簡(jiǎn)單的方式
- 添加 lombok 框架支持
- 使用
@slf4j
注解輸出日志
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
lombok 提供的 @Slf4j
會(huì)提供一個(gè)日志對(duì)象 log, 我們直接使用就可以
import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController public class LogController { @PostConstruct public void logger() { log.info("打印日志"); } }
idea反編譯的字節(jié)碼是這樣的
到此這篇關(guān)于Spring Boot 日志的文章就介紹到這了,更多相關(guān)Spring Boot 日志內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot中l(wèi)ogback日志配置的詳細(xì)說(shuō)明
- 一文帶你搞定SpringBoot Log4j2日志配置文件
- SpringBoot日志配置SLF4J和Logback的方法實(shí)現(xiàn)
- Spring?Boot整合log4j2日志配置的詳細(xì)教程
- SpringBoot日志配置全過(guò)程
- Spring?Boot日志打印配置詳細(xì)介紹
- Springboot日志配置的實(shí)現(xiàn)示例
- SpringBoot3配置Logback日志滾動(dòng)文件的方法
- 如何為?Spring?Boot?項(xiàng)目配置?Logback?日志
- Spring Boot配置日志的實(shí)現(xiàn)步驟
相關(guān)文章
SpringBoot實(shí)現(xiàn)密碼安全存儲(chǔ)的五種方式小結(jié)
項(xiàng)目開發(fā)中,密碼安全存儲(chǔ)是非常關(guān)鍵的一環(huán),作為開發(fā)者,我們需要確保用戶的密碼在存儲(chǔ)時(shí)被安全地加密,避免因數(shù)據(jù)泄露而造成嚴(yán)重后果,所以本文給大家介紹了SpringBoot實(shí)現(xiàn)密碼安全存儲(chǔ)的5種方式,需要的朋友可以參考下2025-03-03springmvc使用@notNull注解驗(yàn)證請(qǐng)求參數(shù)方式
這篇文章主要介紹了springmvc使用@notNull注解驗(yàn)證請(qǐng)求參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教<BR>2024-01-01使用springboot時(shí),解決@Scheduled定時(shí)器遇到的問(wèn)題
這篇文章主要介紹了使用springboot時(shí),解決@Scheduled定時(shí)器遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Springboot?JPA級(jí)聯(lián)操作的實(shí)現(xiàn)(一對(duì)一、一對(duì)多、多對(duì)多)
本文深入解析JPA中的一對(duì)一、一對(duì)多和多對(duì)多級(jí)聯(lián)操作,包括實(shí)體間的關(guān)系建立、查詢、保存、刷新和刪除等操作,具有一定的參考價(jià)值,感興趣的可以了解一下2025-07-07java實(shí)現(xiàn)MD5加密算法的實(shí)例代碼
這篇文章主要介紹了java實(shí)現(xiàn)MD5加密算法的實(shí)例代碼,有需要的朋友可以參考一下2013-12-12Java生成訂單號(hào)或唯一id的高并發(fā)方案(4種方法)
本文主要介紹了Java生成訂單號(hào)或唯一id的高并發(fā)方案,包括4種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01