【JavaEE】Spring Boot 開發(fā)要點總結(jié)(3)
【JavaEE】Spring Boot 開發(fā)要點總結(jié)(3)
1. 日志有什么作用
寫代碼不是概率事件,bug的出現(xiàn)必然是有原因的,而日志的主要作用就是,排查和定位問題!
- 而日志的生成就是隨著程序的進(jìn)行和一步步生成的,不說全部過程都記錄得清清楚楚,至少重要的點和環(huán)節(jié)或者一些異常情況都有記錄
- 而通過日志的 “前后邏輯分析、類型級別、日志內(nèi)容信息” ,就可以定位和排查了
- 就比如我們之前寫普通 java 代碼在控制臺打印的信息和調(diào)試頁面的信息差不多,都是讓我們知道程序執(zhí)行的過程怎么樣~
除此之外,我們還能實現(xiàn)以下功能:
- 記錄用戶登錄日志,方便分析用戶是正常登錄還是惡意破解用戶
- 記錄系統(tǒng)的操作日志,方便重要數(shù)據(jù)恢復(fù)和定位操作人
- 記錄程序的執(zhí)行時間,方便為以后優(yōu)化程序提供數(shù)據(jù)支持
例如,啟動項目的時候,控制臺顯示的就是,日志,標(biāo)準(zhǔn)的日志:
而且這些標(biāo)準(zhǔn)的日志,都是有固定格式的~
三個問題:
- Spring Boot 內(nèi)置了日志框架,才能按照固定格式輸出日志, 這些信息代表什么呢?
- 格式并不需要開發(fā)者去設(shè)計
- 默認(rèn)情況下,項目輸出的日志并非開發(fā)者自定義和打印的,Spring框架在運行時會自動打印一些日志, 如何自定義打印日志呢?
- 格式有了,內(nèi)容和打印時機(jī)還是需要自定義的
- 日志默認(rèn)是打印在控制臺, 如何實現(xiàn)持久化呢?
- 控制臺的,重新運行就會清空,日志得保存下來,才有意義,后續(xù)才能查閱
2. 日志格式
這就是日志框架提供的格式,提供的信息還是很全面的!
2.1 日志框架原理
Spring Boot之所以可以打印日志,是因為內(nèi)置了兩個日志框架:
-
slf4j
-
logback
為什么需要兩個呢?
- slf4j 是開發(fā)者使用和調(diào)用的框架
- logback 最底層實現(xiàn)日志相關(guān)操作的框架
- 其實這里的思想跟 JQuery 和 JDBC 的思想差不多
- 多種瀏覽器統(tǒng)一滿足JQuery,開發(fā)者統(tǒng)一地使用開發(fā)API,瀏覽器怎么識別代碼展示出來的與開發(fā)者無關(guān)
- 多種數(shù)據(jù)庫統(tǒng)一滿足JDBC,開發(fā)者統(tǒng)一地使用開發(fā)API,底層怎么實現(xiàn)數(shù)據(jù)持久化與開發(fā)者無關(guān)
- 一種 低耦合高內(nèi)聚 的分工
而這里,多種底層實現(xiàn)日志相關(guān)操作的框架統(tǒng)一支持slf4j,開發(fā)者統(tǒng)一地使用開發(fā)API,底層怎么實現(xiàn)日志相關(guān)操作的與開發(fā)者無關(guān)
- logback就是其中一種底層框架
后面設(shè)置日志級別,通過日志級別篩選 …等操作,底層由框架幫我們?nèi)崿F(xiàn),對于開發(fā)者,這些“坐享其成”的事太多了,我們要專心開發(fā),不必可以他們的存在
3. 日志的打印
3.1 System.out.println
這是我們普通java程序的日志打印方式,效果平庸,信息很少:
運行后,瀏覽器訪問:
查看控制臺:
如果要打印時間:
效果:
其他的信息獲取和組織起來就更加麻煩了~
- 而自己去加日志級別沒有作用,你只是拼接了字符串罷了
- 這樣就檢索不了
并且對于后面第三個持久化的問題,sout的日志無法持久化保存
3.2 使用日志框架
程序能夠啟動并且能打印日志,就什么這個框架已經(jīng)引入進(jìn)來了,只需要以下操作:
-
獲取日志工廠
- 生成一個日志制造器
一定要選擇,slf4j框架的類
- 這里就涉及到了工廠模式,通過工廠類LoggerFactory去獲取實例對象
- 能猜到,傳過去的類對象,就是對應(yīng)“包名+類名”的那一段信息
- 調(diào)用方法進(jìn)行打印
訪問一下試試:
可見,通過框架提供的API,就可以有效地設(shè)置日志級別,方法名對應(yīng)的就是日志級別~
- 并且,日志格式跟系統(tǒng)日志一模一樣~
但是,為什么我們打印了五條,卻只顯示三條呢?
- 這就是對日志級別的篩選操作
3.3 日志級別
- trace:微量、少許、痕跡,級別最低
- debug:調(diào)試日志級別
- info:普通日志級別
- warn:警告日志級別
- error:錯誤日志級別
-
fatal:致命日志級別
- 只有系統(tǒng)崩潰時才會輸出的日志級別,并沒有fatal( )方法
- 級別最高
從上到下,日志級別遞增!
而系統(tǒng)如何篩選日志的呢?
- 可見,我們啥也沒設(shè)置的情況下,顯示閾值是info,只顯示跟info同級或者比info級別高的日志 => ≥info
- 這也是一種篩選~
而我們?nèi)ズY選的話,就是根據(jù)這個原理,去設(shè)置默認(rèn)顯示閾值
3.3.1 設(shè)置默認(rèn)日志顯示閾值
效果:
- 看似沒有啟動成功,其實是因為trace和debug的日志太多了!
- 所以我們篩查的應(yīng)該是≥info,≥warn,≥error的
效果:
- info不顯示了
- 顯示 ≥warn 的日志了~
日志級別的作用就是:過濾信息
- 將不需要的日志屏蔽掉
根據(jù)其他信息進(jìn)行篩選排查的話,之后需要用到就去學(xué)~
3.3.2 針對一個目錄設(shè)置日志顯示閾值
要求:對于controller目錄,顯示閾值為info;對于model目錄,顯示閾值為error
-
logging.level.[路徑]
- 代表設(shè)置該路徑下以及其子目錄的日志顯示閾值
- 其實設(shè)置默認(rèn)日志顯示閾值也是這個原理,代表設(shè)置root目錄下的所有…
- 不過,越細(xì)致的優(yōu)先級越高
效果:
4. 日志持久化
日志持久化,就是把日志保存到文件里,也就是保存到電腦磁盤里,后續(xù)在文件里去觀看,可以通過文本編輯器進(jìn)行一些查找查看~
配置項不懂的,可以去官方文檔中解惑:Common Application Properties (spring.io)
- 以下內(nèi)容只涉及部分,要想了解更多,閱讀文檔!
4.1 設(shè)置日志保存路徑
不需要設(shè)置“要不要保存”的選項,因為設(shè)置了后還是需要給一個保存路徑,還不如直接設(shè)置路徑,就代表了兩種含義
- 需要保存日志
- 保存日志的地址
- 保存到D盤的馬庫目錄里:
控制臺:
文件目錄:
默認(rèn)名為spring,類型為.log文件
并且目錄不存在會自動創(chuàng)建
這個屬性不能設(shè)置文件名
多按幾下瀏覽器刷新:
以追加的方式更新:
4.2 設(shè)置日志打印格式
比如這個毫秒,我不喜歡,我要把他去掉:
效果:
日志文件里:
并不會更新之前的內(nèi)容,而是往后去追加~
補(bǔ)充:
- 刪除幾條信息后按,Ctrl s
log文件修改后不能保存,只能另存為或者選擇替換原本的文件
4.3 設(shè)置日志文件名
好像不符合預(yù)期猜想,key.log在哪:
原來在這兒~
所以path和name不能搭配~
- 這樣生成的日志文件有兩個~
而name對應(yīng)的被認(rèn)為是相對路徑,就保存到項目目錄里了
- 改為具體位置~
- perfect!
4.4 面臨的問題
- 追加的方式去寫到文件里的,那么一直這樣下去,會不會文件太大,磁盤炸了?!
- 文件太大,查看不方便,打開特別慢
給文件設(shè)置極限大小
- 日志框架里是有默認(rèn)的大小限制的
- 如果不進(jìn)行配置,日志文件達(dá)到一定的大小,就會重新創(chuàng)建一個新文件,在原文件名加上后綴(比如時間),后續(xù)的日志追加到這個新文件里
當(dāng)然,這些效果的實現(xiàn),不止這一種做法,也還有更多的效果可以實現(xiàn),可以去官方文檔中閱讀學(xué)習(xí),之后遇到需要實現(xiàn)的效果,專門去查即可
5. lombok框架
Lombok雖然不是IDEA的“兄弟產(chǎn)品”,但是卻能擺在一開始選擇依賴的頁面里:
說明這并不是等閑之輩,很多公司都在用
而它出現(xiàn)就是為了快速開發(fā)java項目的!
- 當(dāng)然每個框架都是這樣的
- 那么Lombok究竟好用在哪呢?
5.1 節(jié)省重復(fù)簡單代碼的書寫
對于這些老朋友方法,我們再熟悉不過了,這些代碼的特點就是,必要但是簡單并且屬性如果比較多,代碼就會特別長
而Lombok框架提供的注解,很好的解決了這個問題:
- 注解幫助我們實現(xiàn)很多邏輯,甚至控制我們的操作顯示,功能很強(qiáng)大
- 它不像一些API的類和方法參與到代碼里,而是加在旁邊,對我們進(jìn)行強(qiáng)大的輔助,冥冥之中發(fā)揮強(qiáng)大的功能!
下載lombok插件和引入依賴:
其實在創(chuàng)建項目的時候就引入了,并且如果沒有安裝插件,也會自動幫你安裝~
注解介紹:
屬性越多,構(gòu)造方法的個數(shù)呈階乘倍數(shù)增加,所以全部都加上是不現(xiàn)實的,并且沒多大必要,并不需要每個都存在~
如果你覺得不夠簡潔,還可以用 注解@Data,它等同于:
@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor
等于這一整套~
當(dāng)然,你自己寫的代碼,會覆蓋原有的~
5.2 快速讀寫日志文件
同樣的,用到注解
這樣后,在類的內(nèi)部就可以直接使用一個靜態(tài)常量 log 了,代表的就是日志制造器
5.3 lombok實現(xiàn)原理
java程序執(zhí)行的流程:
而Lombok就是在編碼的時候,減輕了.java用戶代碼的負(fù)擔(dān):
我們沒有書寫對應(yīng)的 log 以及Getter和Setter…,但是Lombok幫我們在.class里去添加了對應(yīng)的字節(jié)碼:
而那個小辣椒插件,是不可或缺的存在,因為沒有它,我們在開發(fā)階段,就會被系統(tǒng)判定沒有對應(yīng)的定義,以至于爆紅,沒有題詞…
- 插件不等同于框架,插件的存在是在開發(fā)上和視覺上的提升
- 例如雖然class文件里有定義,但你現(xiàn)在的java代碼上確實沒有對應(yīng)的定義,卻可以使用,有題詞,且不會爆紅,這就是插件的幫助,將一些注解的含義“告訴”編譯器,一些東西算他們定義過了~
- 插件的復(fù)雜實現(xiàn),不是開發(fā)者需要注意的,“坐享其成即可” (>^ ω ^<)
文章到此結(jié)束!謝謝觀看
可以叫我 小馬,我可能寫的不好或者有錯誤,但是一起加油鴨??!文章來源:http://www.zghlxwxcb.cn/news/detail-632284.html代碼位置:spring_boot_demo2/src/main · 游離態(tài)/馬拉圈2023年8月 - 碼云 - 開源中國 (gitee.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-632284.html
到了這里,關(guān)于【JavaEE】Spring Boot - 日志文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!