SpringBoot日志文件的實現(xiàn)示例
一、日志的作用
日志是程序的重要組成部分,想象一下,如果程序報錯了,不讓你打開控制臺看日志,那么你能找到報錯的原因嗎
答案是否定的,寫程序不是買彩票,不能完全靠猜,因此日志對于我們來說,最主要的用途就是排除和定位問題
除了發(fā)現(xiàn)和定位問題之外,我們還可以通過日志實現(xiàn)以下功能:
- 記錄用戶登錄日志,方便分析用戶是正常登錄還是惡意破解用戶。
- 記錄系統(tǒng)的操作日志,方便數(shù)據(jù)恢復(fù)和定位操作人。
- 記錄程序的執(zhí)行時間,方便為以后優(yōu)化程序提供數(shù)據(jù)支持。
以上這些都是日志提供的非常實用的功能
日志真實使用案例:
關(guān)鍵節(jié)點上的關(guān)鍵數(shù)據(jù)日志記錄舉例:例如教務(wù)系統(tǒng),在注冊時候不止要在教務(wù)系統(tǒng)添加一條用戶記錄,同時也會給論壇添加一條一模一樣的用戶記錄,這樣做的目的是為了實現(xiàn)一次注冊,多處使用的目的。不需要用戶在兩邊系統(tǒng)注冊了,等于在程序中以極低的成本實現(xiàn)的用戶數(shù)據(jù)的同步,但這樣設(shè)計有一個致命的問題,用戶在教務(wù)系統(tǒng)注冊信息的時候,如果論壇掛了,那么用戶的注冊行為就會失敗?因為用戶在注冊的時候需要同步注冊到論壇系統(tǒng),但論壇現(xiàn)在掛了,這個時候怎么辦呢?
最簡單的解決方案,教務(wù)系統(tǒng)在注冊的時候,不管論壇是否注冊成功,都給用戶返回成功,那這個時候如果論壇注冊失敗了怎么辦?非常簡單,如果注冊失敗了,記錄一下日志,等論壇恢復(fù)正常之后,把日志給論壇的管理人員,讓他?動將注冊失敗的用戶同步到論壇系統(tǒng),這樣就最低成本的解決了問題。這就是日志的重要作用
二、日志怎么用
Spring Boot 項目在啟動的時候默認(rèn)就有日志輸出
以上內(nèi)容就是 Spring Boot 輸出的控制臺日志信息。
通過上述日志信息我們能發(fā)現(xiàn)以下 3 個問題:
Spring Boot 內(nèi)置了日志框架(不然也輸出不了日志)。默認(rèn)情況下,輸出的日志并非是開發(fā)者定義和打印的,那開發(fā)者怎么在程序中自定義打印日志呢?日志默認(rèn)是打印在控制臺上的,而控制臺的日志是不能被保存的,那么怎么把日志永久的保存下來呢 三、自定義日志打印 1、使用日志對象打印日志
Spring Boot自定義日志的打印:
1). 在一個類中先獲取到打印日志對象(日志框架提供的日志對象,而日志框架默認(rèn)已經(jīng)集成到Spring Boot 里了);
- 得到日志對象Logger ->Logger 對象是屬于 org.slf4j 包下的,不要導(dǎo)入錯包
- 因為 Spring Boot 中內(nèi)置了日志框架 Slf4j,所以咱們可以直接在程序中調(diào)用 slf4j 來輸出日志
2). 使用日志對象提供的方法實現(xiàn)日志的打印
- 在程序中獲取日志對象需要使用日志工廠 LoggerFactory
- 日志工廠需要將每個類的類型傳遞進(jìn)去,這樣我們才知道日志的歸屬類,才能更方便、更直觀的定位到問題類
@Controller @ResponseBody // 非靜態(tài)數(shù)據(jù) public class UserController { // 1、先得到日志對象——來自于slf4j private final static Logger log = LoggerFactory.getLogger(UserController.class); // 設(shè)置當(dāng)前類的類型 @RequestMapping("/sayhi") public void sayHi() { log.trace("I'm trace"); log.debug("I'm debug"); log.info("I'm info"); log.warn("I'm warn"); log.error("I'm error"); } }
訪問 http://localhost:8080/sayhi,打印日志效果展示:
默認(rèn)日志輸出級別:
當(dāng)前未配置文件中的日志設(shè)置,觀察控制臺輸入的日志級別,得到以下結(jié)論,日志的輸出級別,默認(rèn)是 info
常?的日志框架說明(了解)
2、日志格式說明
四、日志級別與分類
1、什么是日志級別
日志的級別就是為了篩選符合目標(biāo)的日志信息的。試想一下這樣的場景,假設(shè)你一家 2 萬人公司的老板,那么每人員工的日常工作和瑣碎的信息都要反饋給你嗎?一定不會,因為你根本沒有那么多經(jīng)歷。于是就有了組織架構(gòu),而組織架構(gòu)就會分級,有很多的級別設(shè)置,如下圖所示
有了組織架構(gòu)之后,就可以逐級別匯報消息了,例如:組員匯報給組長;組長匯報給研發(fā)一組;研發(fā)一組匯報給 Java 研發(fā),等等依次進(jìn)行匯報。
而日志分級大概的道理也是一樣的,有了日志級別之后就可以過濾自已想看到的信息了,比如設(shè)置日志級別為 error,那么就可以只看程序的報錯日志了,對于普通的調(diào)試日志和業(yè)務(wù)日志就可以忽略了,從而節(jié)省開發(fā)者的信息篩選時間
2、日志級別分類
- trace:微量,少許的意思,級別最低
- info:普通的打印信息(默認(rèn)級別)
- debug:需要調(diào)試時候的關(guān)鍵信息打印
- warn:警告,不影響使用,但需要注意的問題
- error:錯誤信息,級別較高的錯誤日志信息
- fatal:致命的,因為代碼異常導(dǎo)致程序退出執(zhí)行的事件 (系統(tǒng)輸出的日志,不能自定義打印)
日志級別的順序:
越往上接收到的消息就越少
3、日志使用
日志級別配置只需要在配置文件中設(shè)置 “logging.level” 配置項即可,配置根路徑的日志級別,application.properties:
# 設(shè)置全局的日志級別 logging.level.root=trace
# 設(shè)置局部的日志級別 logging.level.com.example.springboot_logger=warn
注意: 當(dāng)存在局部日志級別 和 全局的日志級別設(shè)置時,當(dāng)訪問局部日志時,使用的是局部日志級別,也就是局部日志級別優(yōu)先級 > 全局的日志級別
五、日志持久化
# 設(shè)置全局的日志級別 logging.level.root=info # 設(shè)置局部的日志級別 logging.level.com.example.springboot_logger.controller=trace
以上的日志都是輸出在控制臺上的,然而在生產(chǎn)環(huán)境上咱們需要將日志保存下來,以便出現(xiàn)問題之后追溯問題,把日志保存下來的過程就叫做持久化
**1). 在配置文件中指定日志的存儲目錄,**當(dāng)設(shè)置了保存路徑之后,Spring Boot 就會將控制臺的日志寫到相應(yīng)的目錄或文件下了
**2). 在配置文件中設(shè)置日志保存的名稱,**日志會自動進(jìn)行持久化
1、配置日志文件的保存路徑
錯誤方式: logging.file.path=F:\Download
——SpringBoot會認(rèn)為是一個特殊的字符,而非目錄,所以日志持久化不會成功
——正確設(shè)置日志路徑的方式 1:
# 配置日志文件的保存路徑 logging.file.path=F:/Download
生成一個 spring.log
文件,vscode 打開:
——正確設(shè)置日志路徑的方式 2:
# 配置日志文件的保存路徑 # logging.file.path=F:/Download logging.file.path=F:\\Download
刪除此文件,重新運行,同樣會生成 spring.log
文件
2、配置日志文件的文件名
# 設(shè)置日志文件的保存名稱 # 1) # logging.file.name=spring_boot.log # 2) 指定目錄 logging.file.name=F:\\Download\\spring_boot.log
生成一個 spring_boot.log
文件
日志數(shù)據(jù)默認(rèn)是追加而不是覆蓋,當(dāng)日志數(shù)據(jù)變多,也不需要設(shè)置日志大小,當(dāng)用滿時,會自動以數(shù)字 123… 分割文件
綜合練習(xí):將 controller 包下 error 級別以上的日志保存到 log_all.log 下,將 service 下 warn級別以上的日志保存到 log_all.log 下
實現(xiàn)的關(guān)鍵步驟:
- 不同包定義不同的日志級別。
- 使用日志對象打印所有類型的日志。
- 設(shè)置固定的日志保存文件名
六、更簡單的日志輸出—lombok
1、lombok
每次都使用 LoggerFactory.getLogger(xxx.class) 很繁瑣,且每個類都添加一遍,也很麻煩,這里講一種更好用的日志輸出方式,使用 lombok 來更簡單的輸出
1). 添加 lombok 框架支持
——添加插件 EditStarters,
——使用 EditStarters 添加 lombok
2). 使用 @slf4j 注解輸出日志
@Controller // 直接和前端交互,不能用 @Service @ResponseBody @Slf4j // 替代了 LoggerFactory.getLogger 操作 public class UserService { @RequestMapping("/sayhi2") public void sayHi() { log.trace("I'm trace"); log.debug("I'm debug"); log.info("I'm info"); log.warn("I'm warn"); log.error("I'm error"); } }
——設(shè)置日志級別配置 application.properties:
# 設(shè)置局部的日志級別 logging.level.com.example.springboot_logger.controller=trace
——訪問 http://localhost:8080/sayhi2:
注意:使用 @Slf4j 注解,在程序中使用 log 對象即可輸入日志,并且只能使用 log 對象才能輸出,這是 lombok 提供的對象名
2、lombok 原理解釋
lombok 能夠打印日志的密碼就在 target 目錄里?,target 為項目最終執(zhí)行的代碼,查看 target 目錄如下:
Java 程序的運行原理:
Lombok 的作用如下圖所示:
3、lombok 更多注解說明
基本注解:
注解 | 作 | |
---|---|---|
@Getter | 動添加 getter 法 | |
@Setter | 動添加 setter 法 | |
@ToString | 動添加 toString 法 | |
@EqualsAndHashCode | 動添加 equals 和 hashCode 法 | |
@NoArgsConstructor | 動添加參構(gòu)造法 | |
@AllArgsConstructor | 動添加全屬性構(gòu)造法,順序按照屬性的定義順序 | |
@NonNull | 屬性不能為 null | |
@RequiredArgsConstructor | 動添加必需屬性的構(gòu)造法,final + @NonNull 的 屬性為必需 |
組合注解:
注解 | 作用 |
---|---|
@Data | @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor |
日志注解:
注解 | 作用 |
---|---|
@Slf4j | 添加個名為 log 的志,使slf4j |
總結(jié):
日志是程序中的重要組成部分,使用日志可以快速的發(fā)現(xiàn)和定位問題,Spring Boot 內(nèi)容了日志框架,默認(rèn)情況下使用的是 info 日志級別將日志輸出到控制臺的,我們可以通過 lombok 提供的 @Slf4j 注解和 log 對象快速的打印自定義日志,日志包含 6 個級別:
- trace:微量,少許的意思,級別最低;
- info:普通的打印信息;
- debug:需要調(diào)試時候的關(guān)鍵信息打??;
- warn:警告,不影響使用,但需要注意的問題;
- error:錯誤信息,級別較高的錯誤日志信息;
- fatal:致命的,因為代碼異常導(dǎo)致程序退出執(zhí)行的事件。
日志級別依次提升,而日志界別越高,收到的日志信息也就越少,我們可以通過配置日志的保存名稱或保存目錄來將日志永久地保存下來
到此這篇關(guān)于SpringBoot日志文件的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot 日志文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
聊聊Arrays.deepToString()和Arrays.toString()的區(qū)別
這篇文章主要介紹了聊聊Arrays.deepToString()和Arrays.toString()的區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02第三方包jintellitype實現(xiàn)Java設(shè)置全局熱鍵
本文主要介紹了,在java中使用第三方插件包jintellitype來實現(xiàn)全局熱鍵,非常的簡單,但是很實用,有需要的朋友可以參考下,歡迎一起來參與改進(jìn)此項目2014-09-09mybatis注解之@Mapper和@MapperScan的使用
這篇文章主要介紹了mybatis注解之@Mapper和@MapperScan的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10SpringBoot集成tika實現(xiàn)word轉(zhuǎn)html的操作代碼
Tika是一個內(nèi)容分析工具,自帶全面的parser工具類,能解析基本所有常見格式的文件,得到文件的metadata,content等內(nèi)容,返回格式化信息,本文給大家介紹了SpringBoot集成tika實現(xiàn)word轉(zhuǎn)html的操作,需要的朋友可以參考下2024-06-06