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


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

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

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

日志對象的打印方法有很多種,我們可以先使用 info() 方法來輸出日志
@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 依賴:
<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 會幫我們提供?個(gè)日志對象 log, 我們直接使用就可以。

日志框架介紹

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

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

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

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

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

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

重新啟動程序。

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

