03.02 那麼多的日誌組件,你瞭解多少?----使用logback實現日誌配置

目錄

  1. 前言
  2. 常用日誌組件
  3. 什麼是日誌門面和日誌實現
  4. 常見的日誌框架
  5. 日誌使用
  6. @slf4j註解
  7. 日誌的配置
  8. logback-spring配置
  9. 總結

前言

日誌是我們系統必備的功能之一,可以幫助我們開發人員定位系統的異常、錯誤以及運行流程的重要的工具。今天老顧就來介紹一下Spring boot的默認的logback日誌框架

常用日誌組件

java開發日誌處理是發現和調試bug所必不可少的,現在企業中常用的日誌組件有哪些呢?JCL 、 JUL、 SLF4j、Log4j、 Log4j2 、 Logback、 jboss-loggin 等,是不是很亂,很多開發人員對日誌框架理解的不夠透徹,一般日誌是配套出現的

,一般是由一個日誌門面和一個日誌實現配套使用。

什麼是日誌門面和日誌實現?

日誌門面:是日誌實現的抽象層。

日誌實現:具體的日誌功能的實現。

為什麼不直接使用日誌實現,而是又弄了一個叫日誌門面的東西?

因為日誌實現,可能會有一些代碼的優化和改動,避免影響用戶在項目中的使用,使用日誌門面這些統一的接口,假設在實現層代碼做了更改,用戶在項目中使用日誌而調用的接口等等都是不會受影響的

常見的日誌框架有哪些?

那麼多的日誌組件,你瞭解多少?----使用logback實現日誌配置

在實際使用中,是選擇一個抽象層的日誌門面搭配一個底層日誌實現來使用的。

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

日誌的使用

先上一段測試代碼

那麼多的日誌組件,你瞭解多少?----使用logback實現日誌配置

在這裡 ,我們需要在每個類中創建一個 Logger對象,並且使用當前類的類名來創建,那麼 這個類名存在的意義在哪裡?我們可以先運行 第一個測試,看下結果

那麼多的日誌組件,你瞭解多少?----使用logback實現日誌配置

是不是少了個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>

修改代碼

那麼多的日誌組件,你瞭解多少?----使用logback實現日誌配置

上面的日誌輸出方式,是默認方式;怎麼設置日誌輸出,我們來看看怎麼配置?

日誌的配置

日誌可以通過兩種方法配置,一種是application.yml配置,一種是lobback-spring.xml配置。

application.yml配置

這種配置方法 配置項較少,一般有以下屬性配置

1. 配置輸出格式 為 時間 - 消息 換行

<code>logging:
pattern:
console: "%d - %msg%n"/<code>
那麼多的日誌組件,你瞭解多少?----使用logback實現日誌配置

2. 配置日誌輸出位置

<code>logging:
path: /Users/gujiachun/Downloads/<code>

運行後,我們可以看到Downloads下生成了一個文件spring.log這文件是spring生成

那麼多的日誌組件,你瞭解多少?----使用logback實現日誌配置

3. 配置日誌輸出文件

,這樣可以指定日誌輸出到哪個文件

<code>logging:
file: /Users/gujiachun/Downloads/test.log/<code>

我們可以看到在Downloads生成了test文件

那麼多的日誌組件,你瞭解多少?----使用logback實現日誌配置

這裡注意:我們可以配置日誌保存位置,以及具體輸出的文件,如果同時配置的話,會使用我們指定的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也可以看到

那麼多的日誌組件,你瞭解多少?----使用logback實現日誌配置

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實現日誌配置

在上面的 logback-spring.xml中,appender配置了一個規則, ConsoleAppender表明日誌輸出到控制檯,layout表明輸出格式,root節點配置表明該項目基礎的日誌級別為info

,引入 控制檯輸出的規則,那麼我們運行看結果

那麼多的日誌組件,你瞭解多少?----使用logback實現日誌配置

從結果上來看,配置的是 info級別,所以 debug的沒有輸出,現在如果我想把日誌輸出到文件怎麼處理呢,可以使用如下配置,添加一個 appender規則,由於日誌可能比較多,一般是按照日期來輸出日誌,因此如下配置了每天一個日誌到指定位置

那麼多的日誌組件,你瞭解多少?----使用logback實現日誌配置

啟動執行

那麼多的日誌組件,你瞭解多少?----使用logback實現日誌配置

如果我們想把info的日誌和error的日誌區分到兩個文件放置,該怎麼寫呢?

我們可以新建一個規則,結構如上圖,只是在裡面添加了一個過濾器,使用的是範圍過濾,也就是攔截Error級別的信息,如下

那麼多的日誌組件,你瞭解多少?----使用logback實現日誌配置

啟動執行

那麼多的日誌組件,你瞭解多少?----使用logback實現日誌配置

運行後,我們可以在Downloads下的error.log中看到 裡面只有一條記錄,關於error的記錄,但是我們在info的那個文件中,依舊有info和error的信息,那麼如果將info提取出來呢? 能不能也想這樣添加一個過濾器呢,測試一下,經過測試我們發現沒有作用,因為攔截info,error還是會顯示,因為error的優先級高,那麼我們可以利用LevelFilter方法來處理,如下

那麼多的日誌組件,你瞭解多少?----使用logback實現日誌配置

運行後,發現確實實現了 info 和 error的日誌分開,但是 在上圖例子中,雖然我們排除了 error,但是除開info,如果我們還有 warn級別的日誌信息,還是會輸出在 info.log文件中,因為warn優先級比info高,但是我們只是攔截了error而已。

總結

以上介紹了logback的基本用法,下一篇老顧會介紹多環境下的使用,以及生產環境如何配置,謝謝!!!

---End---


最近老顧上傳了微服務網關的分享課程,請大家多多支持

1基於RocketMq的SpringCloud Stream框架實戰入門

2、如何搭建消息中間件應用框架之SpringCloud Stream

3面試必備:網關異常了怎麼辦?如何做全局異常處理?

4Gateway網關係列(二):SpringCloud Gateway入門實戰,路由規則

5Gateway網關係列開篇:SpringCloud的官方網關Gateway介紹

6API網關在微服務架構中的應用,這一篇就夠了

7學習Lambda表達式看這篇就夠了,不會讓你失望的哦(續篇)

8Lambda用在哪裡?幾種場景?

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實戰


分享到:


相關文章: