Spring Boot 日志配置與常見(jiàn)問(wèn)題及解決方案
Spring Boot 日志配置與常見(jiàn)問(wèn)題解析
引言
在軟件開(kāi)發(fā)中,日志記錄是理解應(yīng)用程序行為、定位問(wèn)題和確保合規(guī)性的重要工具。Spring Boot 提供了靈活的日志配置機(jī)制,幫助開(kāi)發(fā)者高效地監(jiān)控和分析應(yīng)用。本文將介紹如何配置 Spring Boot 的日志,解決常見(jiàn)問(wèn)題,并提供實(shí)用建議。
什么是日志?
日志記錄程序在運(yùn)行過(guò)程中產(chǎn)生的各種信息,包括錯(cuò)誤、警告、信息和調(diào)試級(jí)別。日志文件可以幫助開(kāi)發(fā)者快速定位問(wèn)題、跟蹤應(yīng)用程序行為,并滿足合規(guī)性要求。
隨著項(xiàng)目的復(fù)雜度提升, 我們對(duì)日志的打印也有了更高的需求, 而不僅僅是定位排查問(wèn)題.
比如需要記錄?些用戶的操作記錄(?些審計(jì)公司會(huì)要求), 也可能需要使用日志來(lái)記錄用戶的?些喜好,
把日志持久化, 后續(xù)進(jìn)行數(shù)據(jù)分析等. 但是 System.out.print 不能很好的滿足我們的需求, 我們就需要使用?些專(zhuān)門(mén)的日志框架。
日志的重要性
- 快速定位問(wèn)題:通過(guò)分析日志,開(kāi)發(fā)者可以迅速定位應(yīng)用程序中的錯(cuò)誤或性能問(wèn)題。
- 確保合規(guī)性:許多行業(yè)要求應(yīng)用程序符合特定標(biāo)準(zhǔn),日志記錄了應(yīng)用程序的運(yùn)行狀態(tài),便于審計(jì)和合規(guī)性檢查。
- 提高開(kāi)發(fā)效率:日志記錄了應(yīng)用程序的歷史行為,有助于快速?gòu)?fù)現(xiàn)問(wèn)題并優(yōu)化代碼。
我們知道日志主要是為了發(fā)現(xiàn)問(wèn)題, 分析問(wèn)題, 定位問(wèn)題的, 但除此之外, 日志還有很多用途:
1. 系統(tǒng)監(jiān)控
監(jiān)控現(xiàn)在幾乎是?個(gè)成熟系統(tǒng)的標(biāo)配, 我們可以通過(guò)日志記錄這個(gè)系統(tǒng)的運(yùn)行狀態(tài), 每一個(gè)方法的響應(yīng)時(shí)間, 響應(yīng)狀態(tài)等, 對(duì)數(shù)據(jù)進(jìn)行分析, 設(shè)置不同的規(guī)則, 超過(guò)閾值時(shí)進(jìn)行報(bào)警. 比如統(tǒng)計(jì)日志中關(guān)鍵字的數(shù)量,并在關(guān)鍵字?jǐn)?shù)量達(dá)到?定條件時(shí)報(bào)警,這也是日志的常見(jiàn)需求之一
2. 數(shù)據(jù)采集
數(shù)據(jù)采集是?個(gè)比較大的范圍, 采集的數(shù)據(jù)可以作用在很多方面, 比如數(shù)據(jù)統(tǒng)計(jì), 推薦排序等.
• 數(shù)據(jù)統(tǒng)計(jì): 統(tǒng)計(jì)頁(yè)面的瀏覽量(PV), 訪客量(UV), 點(diǎn)擊量等, 根據(jù)這些數(shù)據(jù)進(jìn)行數(shù)據(jù)分析, 優(yōu)化公司運(yùn)營(yíng)策略
• 推薦排序: 目前推薦排序應(yīng)用在各個(gè)領(lǐng)域, 我們經(jīng)常接觸的各行各業(yè)很多也都涉及推薦排序, 比如購(gòu)物, 廣告, 新聞等領(lǐng)域. 數(shù)據(jù)采集是推薦排序工作中必須做的一環(huán), 系統(tǒng)通過(guò)日志記錄用戶的瀏覽歷史, 停留時(shí)長(zhǎng)等, 算法?員通過(guò)分析這些數(shù)據(jù), 訓(xùn)練模型, 給用戶做推薦。
下圖中的數(shù)據(jù)源, 其中?部分就來(lái)自于日志記錄的數(shù)據(jù)


3. 日志審計(jì)
隨著互聯(lián)網(wǎng)的發(fā)展,眾多企業(yè)的關(guān)鍵業(yè)務(wù)越來(lái)越多的運(yùn)行于網(wǎng)絡(luò)之上. 網(wǎng)絡(luò)安全越來(lái)越受到大家的關(guān)注, 系統(tǒng)安全也成為了項(xiàng)目中的?個(gè)重要環(huán)節(jié), 安全審計(jì)也是系統(tǒng)中非常重要的部分. 國(guó)家的政策法規(guī)、行業(yè)標(biāo)準(zhǔn)等都明確對(duì)日志審計(jì)提出了要求. 通過(guò)系統(tǒng)日志分析,可以判斷?些非法攻擊, 非法調(diào)用,以及系統(tǒng)處理過(guò)程中的安全隱患。
比如, 運(yùn)營(yíng)系統(tǒng), 其中運(yùn)營(yíng)?員在通過(guò)界?處理?些數(shù)據(jù)的時(shí)候, 如果沒(méi)有清楚的日志操作記錄, ?條數(shù)據(jù)被刪除或者修改, 你是無(wú)法找到是誰(shuí)操作的,但是如果你做了相應(yīng)的記錄,該數(shù)據(jù)被誰(shuí)刪除或者修改就會(huì)一目了然.
還有?些內(nèi)部的違規(guī)和信息泄漏(比如客戶信息被賣(mài)掉)現(xiàn)象出現(xiàn)后, 如果未記錄留存日志 為事后調(diào)查提供依據(jù), 則事后很難追查(?些公司查看客戶的信息都會(huì)被記錄日志, 如果頻繁查詢也會(huì)報(bào)警。
日志使用
spring 在項(xiàng)目啟動(dòng)的時(shí)候就有日志輸出,如下圖所示:

那么這個(gè)日志跟System.out.print有什么區(qū)別呢?
@RestController
@RequestMapping("/logger")
public class loggerController {
@RequestMapping("/log")
public String log(){
System.out.println("打印日志");
return "打印日志";
}
}可以看到:

可以看到, 我們通過(guò) System.out.print 打印的?志, ? SpringBoot 打印的?志缺少了很多信息.
打印日志
1.在程序中得到打印日志對(duì)象
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
注意:Logger 對(duì)象是屬于 org.slf4j 包下的, 不要導(dǎo)?錯(cuò)包.

日志對(duì)象的打印方法有很多種,我們可以先使用 info() 方法來(lái)輸出日志
@RestController
@RequestMapping("/logger")
public class loggerController {
private Logger logger= LoggerFactory.getLogger(loggerController.class);
@RequestMapping("/log")
public String log(){
logger.info("====日志內(nèi)容=====");
return "打印日志";
}
}效果:

使用注解打印日志 – @Slf4j
添加 lombok 依賴(lài):
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
@Slf4j
@RestController
public class LogController {
public void log(){
log.info("--------------要輸出?志的內(nèi)容----------------");
}
}lombok提供的 @Slf4j 會(huì)幫我們提供?個(gè)日志對(duì)象 log, 我們直接使用就可以。

日志框架介紹

1.門(mén)面模式(外觀模式)
定義:
門(mén)面模式(Facade Pattern)?稱(chēng)為外觀模式, 提供了一個(gè)統(tǒng)?的接口, ?來(lái)訪問(wèn)?系統(tǒng)中的?群接口.
其主要特征是定義了?個(gè)高層接口, 讓子系統(tǒng)更容易使用。
門(mén)面模式主要包含2種角色:
外觀角色(Facade): 也稱(chēng)門(mén)面角色,系統(tǒng)對(duì)外的統(tǒng)?接口.
子系統(tǒng)角色(SubSystem): 可以同時(shí)有?個(gè)或多個(gè) SubSystem. 每個(gè) SubSytem 都不是?個(gè)單獨(dú)的類(lèi),而是?個(gè)類(lèi)的集合. SubSystem 并不知道 Facade 的存在, 對(duì)于 SubSystem 而言, Facade 只是另?個(gè)客戶端而已(即 Facade 對(duì) SubSystem 透明)
比如去醫(yī)院看病,可能要去掛號(hào), 門(mén)診, 化驗(yàn), 取藥, 讓患者或患者家屬覺(jué)得很復(fù)雜, 如果有提供接待人員, 只讓接待?員來(lái)處理, 就很方便。

門(mén)面模式的優(yōu)點(diǎn)
• 減少了系統(tǒng)的相互依賴(lài). 實(shí)現(xiàn)了客戶端與子系統(tǒng)的耦合關(guān)系, 這使得子系統(tǒng)的變化不會(huì)影響到調(diào)用它的客戶端;
• 提高了靈活性, 簡(jiǎn)化了客戶端對(duì)子系統(tǒng)的使用難度, 客戶端無(wú)需關(guān)心子系統(tǒng)的具體實(shí)現(xiàn)方式, 而只需要和門(mén)面對(duì)象交互即可.
• 提高了安全性. 可以靈活設(shè)定訪問(wèn)權(quán)限, 不在門(mén)面對(duì)象中開(kāi)通方法, 就無(wú)法訪問(wèn)
日志格式的說(shuō)明
那打印的日志是什么呢?

從上圖可以看到,日志輸出內(nèi)容元素具體如下(從左往右):
時(shí)間日期:精確到毫秒日志級(jí)別:ERROR, WARN, INFO, DEBUG 或TRACE進(jìn)程ID線程名Logger名(通常使用源代碼的類(lèi)名)日志內(nèi)容
?志級(jí)別
日志級(jí)別代表著?志信息對(duì)應(yīng)問(wèn)題的嚴(yán)重性, 為了更快的篩選符合目標(biāo)的日志信息.
試想一下這樣的場(chǎng)景,假設(shè)你是?家 2 萬(wàn)人公司的老板, 如果每個(gè)員工的日常工作和瑣碎的信息都要反饋給你, 那你?定無(wú)暇顧及. 于是就有了組織架構(gòu),而組織架構(gòu)就會(huì)分級(jí),有很多的級(jí)別設(shè)置,如下圖所示:

有了組織架構(gòu)之后,就可以逐級(jí)別匯報(bào)消息了, 例如:組員匯報(bào)給組長(zhǎng), 組長(zhǎng)匯報(bào)給研發(fā)?組, 研發(fā)?組匯報(bào)給 Java 研發(fā), 等等依次進(jìn)行匯報(bào).
日志級(jí)別大概是同樣的道理,有了日志級(jí)別之后就可以過(guò)濾自己想看到的信息了, 比如只關(guān)注error級(jí)別的, 就可以根據(jù)級(jí)別過(guò)濾出來(lái)error級(jí)別的日志信息, 節(jié)約開(kāi)發(fā)者的信息篩選時(shí)間。
日志級(jí)別的分類(lèi)
1.Error:
嚴(yán)重性問(wèn)題或錯(cuò)誤,常用于捕捉不可恢復(fù)的錯(cuò)誤或異常
2.Warning
警告性信息,常用于提醒可能的問(wèn)題或性能優(yōu)化建議
3.Info
一般信息或狀態(tài)更新,常用于提供程序運(yùn)行的基本信息
4.Debug
詳細(xì)調(diào)試信息,常用于調(diào)試過(guò)程中使用的調(diào)試信息
TRACE: 追蹤信息, 比DEBUG更細(xì)粒度的信息事件(除非有特殊用意,否則請(qǐng)使用DEBUG級(jí)別替代)
5.FATAL
致命信息,表示需要立即被處理的系統(tǒng)級(jí)錯(cuò)誤。
6.error
錯(cuò)誤信息, 級(jí)別較高的錯(cuò)誤日志信息, 但仍然不影響系統(tǒng)的繼續(xù)運(yùn)行。

日志級(jí)別的使用
日志級(jí)別是開(kāi)發(fā)?員自己設(shè)置的. 開(kāi)發(fā)人員根據(jù)自己的理解來(lái)判斷該信息的重要程度。
類(lèi)似公司管理, 通常由領(lǐng)導(dǎo)來(lái)判斷什么樣的事情需要匯報(bào), 什么樣的事情不需要匯報(bào)。
針對(duì)這些級(jí)別, Logger 對(duì)象分別提供了對(duì)應(yīng)的方法, 來(lái)輸出日志。
@RestController
@RequestMapping("/logger")
public class loggerController {
private Logger logger= LoggerFactory.getLogger(loggerController.class);
//打印不同級(jí)別的日志
@RequestMapping("/log")
public String log(){
logger.info("====日志內(nèi)容=====");
logger.trace("====日志內(nèi)容=====");
logger.debug("====日志內(nèi)容=====");
logger.error("====日志內(nèi)容=====");
logger.warn("====日志內(nèi)容=====");
return "打印日志";
}
}SpringBoot 默認(rèn)的日志框架是Logback, Logback沒(méi)有 FATAL 級(jí)別, 它被映射到 ERROR .
出現(xiàn)fatal日志,表示服務(wù)已經(jīng)出現(xiàn)了某種程度的不可用, 需要需要系統(tǒng)管理員緊急介?處理. 通常情況下, ?個(gè)進(jìn)程生命周期中應(yīng)該最多只有一次FATAL記錄.
結(jié)果發(fā)現(xiàn), 只打印了info, warn和error級(jí)別的?志
這與日志級(jí)別的配置有關(guān), ?志的輸出級(jí)別默認(rèn)是 info級(jí)別, 所以只會(huì)打印大于等于此級(jí)別的日志, 也就是info, warn和error。

Spring Boot 日志配置
日志級(jí)別配置只需要在配置?件中設(shè)置"logging.level"配置項(xiàng)即可。
1. 設(shè)置日志級(jí)別和格式
在 application.properties 文件中,可以設(shè)置日志級(jí)別、格式和輸出渠道。常用配置如下:
- 日志級(jí)別:
spring.applog enabled=true(啟用日志記錄) - 日志級(jí)別:
spring.applog level=debug(啟用調(diào)試級(jí)別日志) - 日志格式:
spring.applog format=com.example.MyApplication>${request-global-start}\n(自定義日志格式) - 輸出渠道:
spring.applog channel=applog收集器(指定日志收集器)
properties 和yml只需要配置其中?個(gè)即可
?者轉(zhuǎn)換方法: Properties文件的點(diǎn)( . ) 對(duì)應(yīng)yml文件中的換行
2. 配置日志收集器
使用 ELK Stack(Elasticsearch, Logstash, Kibana)等工具可以將日志高效收集到云存儲(chǔ)中,并進(jìn)行分析。ELK Stack 是常用的日志分析工具,適用于大數(shù)據(jù)量的日志。
3. 查看和分析日志
配置完成后,可以通過(guò)以下命令查看日志:
logrotate:收集和旋轉(zhuǎn)日志文件,確保存儲(chǔ)空間有限時(shí)自動(dòng)刪除舊日志。tail -f:實(shí)時(shí)查看日志文件的末尾部分。
4.日志的持久化
以上的日志都是輸出在控制臺(tái)上的, 然而在線上環(huán)境中, 我們需要把日志保存下來(lái), 以便出現(xiàn)問(wèn)題之后追溯問(wèn)題. 把日志保存下來(lái)就叫持久化。
日志持久化有兩種方式:
- 配置日志文件名
- 配置日志的存儲(chǔ)目錄
配置日志文件名:
yml配置
logging:
file:
name: log/log.log
運(yùn)行結(jié)果顯示, 日志內(nèi)容保存在了對(duì)應(yīng)的目錄下。
配置日志的保存路徑
yml
logging:
file:
path:d/loggeController
可以看到日志在這個(gè)路徑下面了。
5.設(shè)置日志的顏色
需要設(shè)置idea,讓控制臺(tái)中的日志有顏色
1.打開(kāi)啟動(dòng)配置, 添加VM options
輸入:
-Dspring.output.ansi.enabled=ALWAYS

重新啟動(dòng)程序。

可以看到已經(jīng)變顏色了。
常見(jiàn)日志問(wèn)題及解決方法
1. 日志配置文件找不到
問(wèn)題:日志配置文件(如 application.properties)未找到或配置錯(cuò)誤。
解決方法:
- 檢查
application.properties文件是否存在。 - 確保文件路徑正確,例如在
src/main/resources或application.conf中。 - 使用
mvn clean install重新構(gòu)建項(xiàng)目以確保配置文件被正確配置。
2. 日志文件輸出到錯(cuò)誤的地方
問(wèn)題:日志文件被輸出到不可見(jiàn)或錯(cuò)誤的目錄,導(dǎo)致日志無(wú)法查看。
解決方法:
- 檢查日志收集器的配置,確保輸出目錄正確。
- 使用
mvn clean install重新構(gòu)建項(xiàng)目以確保配置文件被正確配置。
3. 日志級(jí)別設(shè)置錯(cuò)誤
問(wèn)題:日志級(jí)別設(shè)置過(guò)高或過(guò)低,導(dǎo)致日志內(nèi)容被截?cái)嗷蝻@示不全。
解決方法:
- 檢查
application.properties中的spring.applog level設(shè)置,確保級(jí)別正確。 - 默認(rèn)級(jí)別為
spring.applog level=error,可以調(diào)整為warning、notice或debug。
4. 日志文件找不到
問(wèn)題:日志文件無(wú)法找到,導(dǎo)致日志記錄失敗。
解決方法:
- 確保日志收集器配置正確,路徑和文件名無(wú)誤。
- 檢查日志文件的權(quán)限,確保應(yīng)用程序有權(quán)限寫(xiě)入目標(biāo)目錄。
- 使用
mvn clean install重新構(gòu)建項(xiàng)目以確保配置文件被正確配置。
總結(jié)
配置 Spring Boot 的日志有助于開(kāi)發(fā)者更好地監(jiān)控和分析應(yīng)用程序。通過(guò)合理設(shè)置日志級(jí)別、格式和收集器,可以確保日志的完整性和有效性。遇到日志相關(guān)問(wèn)題時(shí),首先檢查配置文件和日志收集器的配置,確保日志正常輸出。如果問(wèn)題依然存在,可以嘗試重新構(gòu)建項(xiàng)目或使用日志調(diào)試工具進(jìn)一步排查問(wèn)題。通過(guò)正確的日志配置和分析,開(kāi)發(fā)者可以更高效地解決問(wèn)題,提升應(yīng)用程序的穩(wěn)定性和性能。
- 日志是程序中的重要組成部分,使用日志可以快速的發(fā)現(xiàn)和定位問(wèn)題,Spring Boot 內(nèi)容了日志框架,默認(rèn)情況下使用的是 info 日志級(jí)別將日志輸出到控制臺(tái)的,我們可以通過(guò) lombok 提供的
- @Slf4j 注解和 log 對(duì)象快速的打印自定義日志.
- 日志包含 6 個(gè)級(jí)別, 日志級(jí)別越高,收到的日志信息也就越少,我們可以通過(guò)配置日志的保存名稱(chēng)或保存目錄來(lái)將日志持久化。
到此這篇關(guān)于Spring Boot 日志配置與常見(jiàn)問(wèn)題解析的文章就介紹到這了,更多相關(guān)Spring Boot 日志配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sprintboot使用spring-security包,緩存內(nèi)存與redis共存方式
這篇文章主要介紹了sprintboot使用spring-security包,緩存內(nèi)存與redis共存方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
SpringBoot?整合?Quartz?定時(shí)任務(wù)框架詳解
這篇文章主要介紹了SpringBoot整合Quartz定時(shí)任務(wù)框架詳解,Quartz是一個(gè)完全由Java編寫(xiě)的開(kāi)源作業(yè)調(diào)度框架,為在Java應(yīng)用程序中進(jìn)行作業(yè)調(diào)度提供了簡(jiǎn)單卻強(qiáng)大的機(jī)制2022-08-08
如何解決IDEA沒(méi)有新建servlet選項(xiàng)問(wèn)題
這篇文章主要介紹了如何解決IDEA沒(méi)有新建servlet選項(xiàng)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
java底層AQS實(shí)現(xiàn)類(lèi)ReentrantLock鎖的構(gòu)成及源碼解析
本章我們就要來(lái)學(xué)習(xí)一下第一個(gè)?AQS?的實(shí)現(xiàn)類(lèi):ReentrantLock,看看其底層是如何組合?AQS?,實(shí)現(xiàn)了自己的那些功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
Spring Boot中使用 Spring Security 構(gòu)建權(quán)限系統(tǒng)的示例代碼
本篇文章主要介紹了Spring Boot中使用 Spring Security 構(gòu)建權(quán)限系統(tǒng)的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
SpringBoot+Shiro+Redis+Mybatis-plus 實(shí)戰(zhàn)項(xiàng)目及問(wèn)題小結(jié)
最近也是一直在保持學(xué)習(xí)課外拓展技術(shù),所以想自己做一個(gè)簡(jiǎn)單小項(xiàng)目,于是就有了這個(gè)快速上手 Shiro 和 Redis 的小項(xiàng)目,說(shuō)白了就是拿來(lái)練手調(diào)調(diào) API,然后做完后拿來(lái)總結(jié)的小項(xiàng)目,感興趣的朋友一起看看吧2021-04-04

