SpringBoot學習<三>(日誌)

定義

日誌記錄了系統行為的時間、地點、狀態等相關信息,能夠幫助我們瞭解並監控系統狀態,在發生錯誤或者接近某種危險狀態時能夠及時提醒我們處理,同時在系統產生問題時,能夠幫助我們快速的定位、診斷並解決問題。常日的日誌框架有:

  • 無具體實現的抽象門面框架,如:Commons Logging、SLF4J
  • 具體實現的框架,如:Log4j,Log4j 2,Logback,Jul

日誌發展歷程

  • 1996年早期,歐洲安全電子市場項目組決定編寫它自己的程序跟蹤API(Tracing API)。經過不斷的完善,這個API終於成為一個十分受歡迎的Java日誌軟件包,即Log4j。後來Log4j成為Apache基金會項目中的一員。
  • 期間Log4j近乎成了Java社區的日誌標準。據說Apache基金會還曾經建議sun引入Log4j到java的標準庫中,但Sun拒絕了。
  • 2002年Java1.4發佈,Sun推出了自己的日誌庫JUL(Java Util Logging),其實現基本模仿了Log4j的實現。在JUL出來以前,log4j就已經成為一項成熟的技術,使得log4j在選擇上佔據了一定的優勢。
  • 接著,Apache推出了Jakarta Commons Logging,JCL只是定義了一套日誌接口(其內部也提供一個Simple Log的簡單實現),支持運行時動態加載日誌組件的實現,也就是說,在你應用代碼裡,只需調用Commons Logging的接口,底層實現可以是log4j,也可以是Java Util Logging。
  • 後來(2006年),Ceki Gülcü不適應Apache的工作方式,離開了Apache。然後先後創建了slf4j(日誌門面接口,類似於Commons Logging)和Logback(Slf4j的實現)兩個項目,並回瑞典創建了QOS公司,QOS官網上是這樣描述Logback的:The Generic,Reliable Fast&Flexible Logging Framework(一個通用,可靠,快速且靈活的日誌框架)。
  • 現今,Java日誌領域被劃分為兩大陣營:Commons Logging陣營和SLF4J陣營。Commons Logging在Apache大樹的籠罩下,有很大的用戶基數。但有證據表明,形式正在發生變化。2013年底有人分析了GitHub上30000個項目,統計出了最流行的100個Libraries,可以看出slf4j的發展趨勢更好。
  • Apache眼看有被Logback反超的勢頭,於2012-07重寫了log4j 1.x,成立了新的項目Log4j 2。Log4j 2具有logback的所有特性。

slf4j

slf4j:simple logging facade for java的縮寫,翻譯為java的簡單日誌外觀。slf4j是一個開源項目,它提供一些API來使用不同的日誌框架,比如: java.util.logging,logback,log4j等。slf4j使用戶可以在運行時嵌入他們想使用的日誌框架。從名字中可以看出,它其實使用的是facade設計模式來實現的。使用slf4j,只有一個強制性的依賴,就是slf4j-api-x.x.x.jar,我們在編寫代碼的時候,只會使用這個jar包裡的API,應用程序在運行時去類路徑下查找綁定的具體日誌框架,並使用該綁定的日誌框架進行實際的日誌操作,如果在應用程序的類路徑下面沒有找到合適的綁定的話,slf4j默認使用一個沒有任何操作的實現。

SpringBoot學習<三>(日誌)

 slf4j為不同的日誌框架提供了不同的綁定,在slf4j提供的分發包裡包含了一些綁定。比如:

  1)slf4j-log4j12-1.7.7.jar,用來綁定1.2版本的log4j日誌框架,log4j是一個廣泛使用的日誌框架,要使用這個框架,當然還必須包含log4j的jar包在類路徑下面。

  2)slf4j-jdk14-1.7.7.jar,用來綁定jdk的日誌框架java.util.logging(常被稱為jdk 1.4 logging),不需要額外的jar包。

  3)slf4j-nop-1.7.7.jar, slf4j-simple-1.7.7.jar,綁定的日誌框架分別為 不執行任何操作 和 把日誌輸入到System.err。不需要額外的jar包。

  4)slf4j-jcl-1.7.7.jar,用來綁定日誌框架Jakarta Commons Logging。

  5)logback-classic-1.0.13.jar,這個綁定包不是slf4j項目提供的,而是是logback項目提供的,它本身就是基於slf4j API實現的。使用logback還需要logback-core-1.0.13.jar。

springboot日誌框架

SpringBoot採用slf4j+logback日誌框架。

spring採用(commons-logging)日誌框架、Hibernate採用(jboss-logging)日誌框架等等,那麼SpringBoot怎麼做統一日誌記錄,即使是別的框架和我一起統一使用slf4j進行輸出?


SpringBoot學習<三>(日誌)

由圖可以看見,導入slf4j其他的實現,加入很多中間包來替換原來的實現,並且移除了其他框架的日誌框架。

SpringBoot學習<三>(日誌)

SpringBoot日誌框架的依賴:

<code><dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring‐boot‐starter‐logging/<artifactid>
/<dependency>/<code>

底層依賴關係:

SpringBoot學習<三>(日誌)

依賴主要引入了 logback-classic (包含了日誌框架 Logback 的實現),log4j-to-slf4j (log4j 向 slf4j 轉換的工具),jul-to-slf4j ( Java 自帶的日誌框架轉換為 slf4j)。

默認不配置日誌,啟動Springboot,可以看到控制檯。

SpringBoot學習<三>(日誌)

  • 時間日期:精確到毫秒
  • 日誌級別:ERROR, WARN, INFO, DEBUG or TRACE
  • 進程ID
  • 分隔符:--- 標識實際日誌的開始
  • 線程名:方括號括起來(可能會截斷控制檯輸出)
  • Logger名:通常使用源代碼的類名
  • 日誌內容

也可以在配置文件配置日誌屬性

<code># 日誌配置
# 指定具體包的日誌級別
logging.level.com.text=debug
# 控制檯和日誌文件輸出格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
# 日誌文件大小
logging.file.max-size=10MB
# 保留的日誌時間
logging.file.max-history=10
# 日誌輸出路徑,默認文件spring.log
logging.path=systemlog
#logging.file=log.log/<code>

配置中的符合定義:

%d{HH:mm:ss.SSS}——日誌輸出時間

%thread——輸出日誌的進程名字

%-5level——日誌級別,並且使用5個字符靠左對齊

%logger- ——日誌輸出者的名字

%msg——日誌消息

%n——換行符

關於日誌的輸出路徑,可以使用 logging.file 或者 logging.path 進行定義,兩者存在關係如下表。

SpringBoot學習<三>(日誌)

指定配置:

給類路徑下放上每個日誌框架自己的配置文件即可;SpringBoot就不使用他默認配置的了。

SpringBoot學習<三>(日誌)

上面是默認的命名規則,並且放在src/main/resources下面即可。

如果你即想完全掌控日誌配置,但又不想用logback.xml作為Logback配置的名字,可以通過logging.config屬性指定自定義的名字:

<code>logging.config=classpath:logging-config.xml/<code>

雖然一般並不需要改變配置文件的名字,但是如果你想針對不同運行時Profile使用不同的日

志配置,這個功能會很有用。例如:

SpringBoot學習<三>(日誌)

springboot中根據不同環境(prod:生產環境,test:測試環境,dev:開發環境)可以定義不同的日誌輸出,在 logback-spring.xml中使用 springProfile 節點來定義,方法如下:

SpringBoot學習<三>(日誌)

文件名稱不是logback.xml,想使用spring擴展profile支持,要以logback-spring.xml命名

可以啟動服務的時候指定 profile (如不指定使用默認),如指定prod 的方式為:

java -jar xxx.jar --spring.profiles.active=prod


分享到:


相關文章: