Spring Boot 日志級別及配置詳解
為什么要學習日志
最主要的原因就是發(fā)現(xiàn)和定位問題,或者根據(jù)日志來分析程序的運行過程。隨著項目的復雜度提升,我們對日志的打印也有了更高的需求,而不僅僅是定位排查問題
比如需要記錄一些用戶的操作記錄(一些審計公司會要求),也可能需要使用日志來記錄用戶的一些喜好,把日志持久化,方便后續(xù)進行數(shù)據(jù)分析等。也可以通過日志記錄這個系統(tǒng)的運行狀態(tài),每一個方法的響應時間,響應狀態(tài)等,設置不同的規(guī)則,超過閾值時進行報警
還有一些內部的違規(guī)和信息泄漏(比如客戶信息被賣掉)現(xiàn)象出現(xiàn)后,如果未記錄留存日志,為事后調查提供依據(jù),那么后續(xù)很難追查(一些公司查看客戶信息的操作都會記錄日志,如果頻繁查詢也會報警)
日志使用
SpringBoot 內置了日志框架 slf4j,我們可以直接調用 slf4j 來輸出日志
打印日志的步驟:
- 在程序中得到日志對象
- 使用日志對象輸出要打印的內容
獲取日志對象需要使用 LoggerFactory,如下代碼所示:
private static final Logger logger = LoggerFactory.getLogger(XXX.class);
LoggerFactory.getLogger 需要傳遞一個參數(shù),標識這個日志的名稱。這樣可以更清晰地知道是哪個類輸出的日志。當有問題時,可以更方便直觀地定位到問題類
注意 Logger 是屬于 org.slf4j 包下的,不要導錯包
我們先使用 info () 方法來輸出日志,如下代碼所示:
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 打印的日志少了很多信息
日志級別
日志級別代表著日志信息對應問題的嚴重性, 為了更快地篩選符合目標的日志信息
日志級別的分類
日志的級別從高到低依次為: FATAL、ERROR、WARN、INFO、DEBUG、TRACE
- FATAL:致命信息,表示需要立即被處理的系統(tǒng)級錯誤
- ERROR:錯誤信息,不影響系統(tǒng)的繼續(xù)運行
- WARN:警告信息,不影響使用,但需要注意的問題
- INFO:普通信息,用于記錄應用程序正常運行時的一些信息,例如系統(tǒng)啟動完成、請求處理完成等
- DEBUG:調試信息,需要調試時候的關鍵信息打印
- TRACE:追蹤信息,比 DEBUG 更細粒度的信息事件 (除非有特殊用意,否則請使用 DEBUG 級別替代)
日志級別是開發(fā)人員自己設置的,根據(jù)開發(fā)人員自己的理解來判斷該信息的重要程度,和測試人員的 Bug 級別沒有關系
日志級別的使用
針對這些級別,Logger 對象分別提供了對應的方法來輸出日志(除了fatal)
Spring Boot 默認集成的日志框架是 Logback。同時,Spring Boot 在日志方面還整合了 SLF4J(Simple Logging Facade for Java),SLF4J 并不是一個具體的日志實現(xiàn)框架,而是一個抽象的日志門面
SLF4J 提供了一套通用的接口規(guī)范,允許開發(fā)者在不修改應用代碼中日志調用方式的前提下,靈活切換底層實際的日志實現(xiàn)框架,比如 Logback、Log4j 等。這就使得應用程序在不同的部署環(huán)境或基于不同的需求,可以輕松地更換日志實現(xiàn),而無需大規(guī)模改動代碼
在 Logback 中,雖然沒有獨立的 FATAL 日志級別,但由于 SLF4J 的存在,它可以將 SLF4J 定義的 FATAL 級別進行映射處理。具體來說,Logback 把 SLF4J 中的 FATAL 級別映射到了 ERROR 級別。這意味著,即使通過其他方式調用 FATAL ,最終也會被映射為 ERROR 級別
通過這種映射機制,即使 Logback 自身沒有專門的 FATAL 級別,但依然能夠和基于 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 級別的日志。因為日志的輸出級別默認是 info ,如果不進行任何配置,那么低于INFO級別的日志就不會打印
日志配置
配置日志級別
yml 配置
logging:
level:
root: debug這樣會將 所有包(包括 Spring 框架內部) 的日志級別都設置為 DEBUG,導致控制臺輸出大量框架層面的調試信息,影響排查效率
將 root 替換為自己代碼中需要打印 DEBUG 日志的包路徑,這樣僅會啟用指定包下的 DEBUG 日志,而 Spring 等其他依賴仍使用默認級別(通常是 INFO)
如果需要對不同包設置不同級別,可以這樣配置:
logging:
level:
# 自定義業(yè)務包開啟 DEBUG 級別日志
org.example.j20250702: debug
# Spring 框架內部日志,只打印 INFO 及更高級別
org.springframework: info配置日志持久化
以上的日志都是輸出在控制臺上的,然而我們常常需要把日志保存下來,以便出現(xiàn)問題之后追溯問題。把日志保存下來就叫持久化
日志持久化有兩種方式
- 配置日志文件的路徑和文件名:
yml 配置
logging:
file:
name: logger/springboot.log后面可以跟絕對路徑或者相對路徑
運行結果顯示,日志內容保存在了對應的目錄下

- 配置日志文件的保存路徑:
yml 配置
logging:
file:
path: log后面可以跟絕對路徑或者相對路徑,但只能設置日志的路徑,文件名固定為 spring.log
運行程序,該路徑下多出一個日志文件: spring.log

logging.file.name 和 logging.file.path 兩個都配置路徑的情況下,只生效其一,以 logging.file.name 為準
配置日志文件分割
如果我們的日志都放在一個文件中,隨著項目的運行,日志文件會越來越大,所以有必要對日志文件進行分割
當然,日志框架也考慮到了這一點,所以如果不進行配置,默認日志文件超過 10MB 就進行分割
| 配置項 | 說明 | 默認值 |
|---|---|---|
| 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:
file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
max-file-size: 1KB
file:
path: log- 日志文件超過 1KB 就分割 (設置 1KB 是為了更好展示文件分割)
- 分割后的日志文件名為:日志名.日期.編號(每日重置)
配置日志打印格式
目前日志打印的格式是默認的,我們可以進行配置,而且支持控制臺和日志文件分別設置
| 配置項 | 默認值 |
|---|---|
| logging.pattern.console (控制臺日志格式) | %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} |
格式說明:
%clr(表達式){顏色}:設置輸入日志的顏色,支持顏色有以下幾種:blue、cyan、faint、green、magenta、red、yellow%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}日期和時間 —— 精確到毫秒
%d{}: 日期
${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX} :非空表達式,獲取系統(tǒng)屬性 LOG_DATEFORMAT_PATTERN , 若不存在,則使用 yyyy-MM-dd HH:mm:ss.SSSXXX 格式,系統(tǒng)屬性可以通過System.getProperty("LOG_DATEFORMAT_PATTERN") 獲取
%p顯示日志級別 ERROR,WARN,INFO,DEBUG,TRACE。%t線程名。%c類的全限定名。%M方法名。%L行號。%m或者%msg顯示輸出消息。%n換行符。%5表示如果字符長度小于 5,則右邊用空格填充。%-5表示如果字符長度小于 5,則左邊用空格填充。%.15表示如果字符長度超過 15,截去多余字符。%15.15表示如果字符長度小于 15,則右邊用空格填充;若字符長度超過 15,截去多余字符。
更多說明,參考: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'項目運行, 觀察日志變化:

通常情況下,咱們就使用默認的日志打印格式即可
設置了顏色,卻沒有生效?
需要配置,讓 idea 支持控制臺顏色顯示。打開啟動配置,添加 VM options



在 VM options 中添加 -Dspring.output.ansi.enabled=ALWAYS

應用并重啟程序
使用lombok提供的注解
每個類都添加一遍LoggerFactory.getLogger(xxx.class) 很繁瑣,lombok 給我們提供了一種更簡單的方式
- 添加 lombok 框架支持
- 使用
@slf4j注解輸出日志
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>lombok 提供的 @Slf4j 會提供一個日志對象 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é)碼是這樣的

到此這篇關于Spring Boot 日志的文章就介紹到這了,更多相關Spring Boot 日志內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java服務調用失敗報Service com.oneinfinite.adflow.api.service.T
在Java開發(fā)中,服務調用是常見的操作,尤其是在微服務架構中,然而,服務調用過程中可能會遇到各種問題,下面我們來看看如何解決Service com.oneinfinite.adflow.api.service.TestService with version 0.0.0 not found的問題吧2025-03-03
Spring Boot熱加載jar實現(xiàn)動態(tài)插件的思路
本文主要介紹在 Spring Boot 工程中熱加載 jar 包并注冊成為 Bean 對象的一種實現(xiàn)思路,在動態(tài)擴展功能的同時支持在插件中注入主程序的 Bean 實現(xiàn)功能更強大的插件2021-10-10
Mybatis分頁插件Pagehelper的PageInfo字段屬性使用及解釋
這篇文章主要介紹了Mybatis分頁插件Pagehelper的PageInfo字段屬性使用及解釋,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05

