目錄
- 前言
- 常用日誌組件
- 什麼是日誌門面和日誌實現
- 常見的日誌框架
- 日誌使用
- @slf4j註解
- 日誌的配置
- logback-spring配置
- 總結
前言
日誌是我們系統必備的功能之一,可以幫助我們開發人員定位系統的異常、錯誤以及運行流程的重要的工具。今天老顧就來介紹一下Spring boot的默認的logback日誌框架。
常用日誌組件
java開發日誌處理是發現和調試bug所必不可少的,現在企業中常用的日誌組件有哪些呢?JCL 、 JUL、 SLF4j、Log4j、 Log4j2 、 Logback、 jboss-loggin 等,是不是很亂,很多開發人員對日誌框架理解的不夠透徹,一般日誌是配套出現的 ,一般是由一個日誌門面和一個日誌實現配套使用。
什麼是日誌門面和日誌實現?
日誌門面:是日誌實現的抽象層。
日誌實現:具體的日誌功能的實現。
為什麼不直接使用日誌實現,而是又弄了一個叫日誌門面的東西?
因為日誌實現,可能會有一些代碼的優化和改動,避免影響用戶在項目中的使用,使用日誌門面這些統一的接口,假設在實現層代碼做了更改,用戶在項目中使用日誌而調用的接口等等都是不會受影響的。
常見的日誌框架有哪些?
在實際使用中,是選擇一個抽象層的日誌門面搭配一個底層日誌實現來使用的。
SpringBoot中默認選擇的搭配是:slf4j+logback
下面分別瞭解一下以上提到的各種門面和實現。
JCL:最後一次版本更新停在了2014年,後來沒有繼續維護更新,一般不考慮選用。
slf4j:這裡提一下日誌實現裡面的log4j和logback,這兩個實現和門面slf4j都是同一個人寫的,他先寫了log4j後,覺得性能可以再做優化,又寫了logback,為了有更加適配的門面,自己又為log4j和logback量身打造了門面slf4j。所以這三者裡面最優的搭配當然是slf4j+logback。
JUL:是java.util.logging包下提供的日誌實現。實現簡陋,很多地方受到開發者的吐槽,所以 首先排除
jboss-loggin: 自誕生之初,就不是為了服務大眾,不受到什麼青睞。
log4j2:log4j問世之後,apache公司發現了日誌市場,自家也開發了一款叫log4j2的產品。
下面老顧就介紹如何配置和使用 SLF4j + logback
日誌的使用
先上一段測試代碼
在這裡 ,我們需要在每個類中創建一個 Logger對象,並且使用當前類的類名來創建,那麼 這個類名存在的意義在哪裡?我們可以先運行 第一個測試,看下結果
是不是少了個debug日誌,下面會介紹,不急
由上圖可知,我們的
類名在日誌中是為了方便我們找到異常是在哪個類中,進行鎖定。因此,使用類名創建的logger的作用就是在這裡,但是如果我們需要在每個類中都這樣的創建一個logger對象,不方便,因此可以通過一個註解來幫我們實現那就是@Slf4j ,該註解就可以幫我們自動創建一個log對象。@Slf4j註解
使用 @Slf4j註解需要兩點
1.安裝lombok插件,可上網查閱
2.添加 lombok的依賴
<code><dependency>
\t<groupid>org.projectlombok/<groupid>
<artifactid>lombok/<artifactid>
<scope>provided/<scope>
/<dependency>/<code>
修改代碼
上面的日誌輸出方式,是默認方式;怎麼設置日誌輸出,我們來看看怎麼配置?
日誌的配置
日誌可以通過兩種方法配置,一種是application.yml配置,一種是lobback-spring.xml配置。
application.yml配置
這種配置方法 配置項較少,一般有以下屬性配置
1. 配置輸出格式 為 時間 - 消息 換行
<code>logging:
pattern:
console: "%d - %msg%n"/<code>
2. 配置日誌輸出位置
<code>logging:
path: /Users/gujiachun/Downloads/<code>
運行後,我們可以看到Downloads下生成了一個文件spring.log這文件是spring生成
3. 配置日誌輸出文件 ,這樣可以指定日誌輸出到哪個文件
<code>logging:
file: /Users/gujiachun/Downloads/test.log/<code>
我們可以看到在Downloads生成了test文件
這裡注意:我們可以配置日誌保存位置,以及具體輸出的文件,如果同時配置的話,會使用我們指定的file為主
4. 配置日誌 輸出級別
日誌一般主要看重的有5個級別,優先級如 DEBUG<info>,而springboot默認配置是INFO級別,所以我們測試代碼中寫了三行,在結果中我們只看到了info 和 error,因為debug優先級比info低,所以我們看不到。/<info>
那麼我們配置一下格式 logging.level.包名或類名: 級別 即可, 舉例如下
<code>logging:
pattern:
console: "%d - %msg%n"
file: /Users/gujiachun/Downloads/test.log
level:
#這裡可以是包名也可以是類名
com.rainbow.goods.test: debug/<code>
運行後,我們可以看到 原來只能看到 info 和 error 的,現在的debug也可以看到
lobback-spring.xml 配置
一、我們先把application.yml的關於日誌的註釋掉,新建一個文件logback-spring.xml,為什麼要取這個名字呢,Spring Boot官方推薦優先使用帶有-spring的文件名作為你的日誌配置(如使用logback-spring.xml,而不是logback.xml),如果我們想自定義名字,可以在 application.yml中通過logging.config=classpath:/xxx.xml等方式配置。
二、注意幾個 xml節點的含義
1、根節點<configuration>包含的屬性/<configuration>
scan:當此屬性設置為 true 時,配置文件如果發生改變,將會被重新加載,默認true 。
scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當 scan 為 true 時,此屬性生效。默認的時間間隔為1分鐘。
debug :當此屬性設置為 true 時,將打印出 logback 內部日誌信息,實時查看 logback 運行狀態。默認值為 false
2、子節點 <root>
root節點是必選節點,用來指定最基礎的日誌輸出級別,只有一個level屬性。
level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設置為INHERITED或者同義詞NULL。默認是DEBUG。可以包含零個或多個元素,標識這個appender將會添加到這個loger。
3、子節點<contextname> 設置上下文名稱/<contextname>
每個logger都關聯到logger上下文,默認上下文名稱為“default”。但可以使用設置成其他名字,用於區分不同應用程序的記錄。一旦設置,不能修改,可以通過 %contextName 來打印日誌上下文名稱,一般來說我們不用這個屬性,可有可無。
4、子節點<property> 設置變量/<property>
用來定義變量值的標籤, 有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值。通過定義的值會被插入到logger上下文中。定義變量後,可以使“${}”來使用變量。
5、子節點<appender>
appender用來格式化日誌輸出節點,有倆個屬性name和class,class用來指定哪種輸出策略,常用就是控制檯輸出策略和文件輸出策略。控制檯輸出 ConsoleAppender
6、子節點五 <loger>
<loger> 用來設置某一個包或者具體的某一個類的日誌打印級別、以及指定 <appender> 。 <loger> 僅有一個 name 屬性,一個可選的 level 和一個可選的 addtivity 屬性。/<loger>/<appender>/<loger>
name :用來指定受此loger約束的某一個包或者具體的某一個類。
level :用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設置此屬性,那麼當前loger將會繼承上級的級別。
addtivity :是否向上級loger傳遞打印信息。默認是true。
簡要說明
appender:配置項,規則,通過這個節點內容配置,我們可以配置輸出位置(控制檯,文件),輸出格式等
root:根節點,表明整個項目基本的日誌級別,裡面可以應用多個appender規則
在上面的 logback-spring.xml中,appender配置了一個規則, ConsoleAppender表明日誌輸出到控制檯,layout表明輸出格式,root節點配置表明該項目基礎的日誌級別為info ,引入 控制檯輸出的規則,那麼我們運行看結果
從結果上來看,配置的是 info級別,所以 debug的沒有輸出,現在如果我想把日誌輸出到文件怎麼處理呢,可以使用如下配置,添加一個 appender規則,由於日誌可能比較多,一般是按照日期來輸出日誌,因此如下配置了每天一個日誌到指定位置
啟動執行
如果我們想把info的日誌和error的日誌區分到兩個文件放置,該怎麼寫呢?
我們可以新建一個規則,結構如上圖,只是在裡面添加了一個過濾器,使用的是範圍過濾,也就是攔截Error級別的信息,如下
啟動執行
運行後,我們可以在Downloads下的error.log中看到 裡面只有一條記錄,關於error的記錄,但是我們在info的那個文件中,依舊有info和error的信息,那麼如果將info提取出來呢? 能不能也想這樣添加一個過濾器呢,測試一下,經過測試我們發現沒有作用,因為攔截info,error還是會顯示,因為error的優先級高,那麼我們可以利用LevelFilter方法來處理,如下
運行後,發現確實實現了 info 和 error的日誌分開,但是 在上圖例子中,雖然我們排除了 error,但是除開info,如果我們還有 warn級別的日誌信息,還是會輸出在 info.log文件中,因為warn優先級比info高,但是我們只是攔截了error而已。
總結
以上介紹了logback的基本用法,下一篇老顧會介紹多環境下的使用,以及生產環境如何配置,謝謝!!!
---End---
最近老顧上傳了微服務網關的分享課程,請大家多多支持
1、基於RocketMq的SpringCloud Stream框架實戰入門
2、如何搭建消息中間件應用框架之SpringCloud Stream
3、面試必備:網關異常了怎麼辦?如何做全局異常處理?
4、Gateway網關係列(二):SpringCloud Gateway入門實戰,路由規則
5、Gateway網關係列開篇:SpringCloud的官方網關Gateway介紹
6、API網關在微服務架構中的應用,這一篇就夠了
7、學習Lambda表達式看這篇就夠了,不會讓你失望的哦(續篇)
8、Lambda用在哪裡?幾種場景?
9、為什麼會出現Lambda表達式,你知道嗎?
10、不說“分佈式事務”理論,直接上大廠阿里的解決方案,絕對實用
11、女程序員問到這個問題,讓我思考了半天,Mysql的“三高”架構
12、大廠二面:CAP原則為什麼只能滿足其中兩項?而不能同時滿足
13、阿里P7二面:聊聊零拷貝的原理
14、秒殺系統的核心點都在這裡,快來取
15、你瞭解如何利用token方式實現分佈式Session嗎?
16、Mysql索引結構演變,為什麼最終會是那個結構呢?讓你一看就懂
17、一場比賽涉及到的知識,用通俗易通的方式介紹併發協調
18、企業實戰Redis全方面思考,你思考了嗎?
19、面試題:Thread的start和run的區別
20、面試題:什麼是CAS?CAS的作用以及缺點
21、如何訪問redis中的海量數據?避免事故產生
22、如何解決Redis熱點問題?以及如何發現熱點?
23、如何設計API接口,實現統一格式返回?
24、你真的知道在生產環境下如何部署tomcat嗎?
25、分享一線互聯網大廠分佈式唯一ID設計 之 snowflake方案
26、分享大廠分佈式唯一ID設計方案,快來圍觀
27、你想了解一線大廠的分佈式唯一ID生成方案嗎?
28、你知道如何處理大數據量嗎?(數據拆分篇)
29、如何永不遷移數據和避免熱點? 根據服務器指標分配數據量(揭秘篇)
30、你知道怎麼分庫分表嗎?如何做到永不遷移數據和避免熱點嗎?
31、你瞭解大型網站的頁面靜態化嗎?
32、你知道如何更新緩存嗎?如何保證緩存和數據庫雙寫一致性?
33、你知道怎麼解決DB讀寫分離,導致數據不一致問題嗎?
34、DB讀寫分離情況下,如何解決緩存和數據庫不一致性問題?
35、你真的知道怎麼使用緩存嗎?
36、如何利用鎖,防止緩存擊穿?重構思想的重要性
37、海量訂單產生的業務高峰期,如何避免消息的重複消費?
38、你知道如何保障生產端100%消息投遞成功嗎?
39、微服務下的分佈式session該如何管理?
40、阿里二面:filter、interceptor、aspect應如何選擇?很多人中招
41、互聯網架構重要組員CDN,很多高級開發都沒有實操過,來看這裡
42、阿里二面:CDN緩存控制原理,看看能不能難住你
43、SpringCloud Alibaba之Nacos多環境多項目管理
44、SpringCloud Alibaba系列之Nacos配置中心玩法
45、SpringCloud Alibaba之Nacos註冊中心
46、SpringCloud Plus版本之SpringCloud Alibaba
47、SpringCloud Alibaba之Nacos集群、持久化
48、SpringCloud Alibaba之Nacos共享配置、灰度配置
49、SpringCloud Alibaba之Sentinel工作原理
50、SpringCloud Alibaba之Sentinel流控管理
51、SpringCloud Alibaba之Sentinel降級管理
52、SpringCloud Alibaba之Sentinel熱點參數限流
53、SpringCloud Alibaba之Sentinel的API實戰
閱讀更多 老顧聊技術 的文章