Java日誌框架用法及常見問題解決方案
日誌定義:
在計算機領域,日誌檔案(logfile)是一個記錄了發生在執行中的作業系統或其他軟體中的事件的檔案,或者記錄了在網路聊天軟體的使用者之間傳送的訊息。
日誌記錄(Logging):是指儲存日誌的行為。最簡單的做法是將日誌寫入單個存放日誌的檔案。
日誌級別優先順序:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
日誌框架的作用:
①:跟蹤使用者對系統訪問,記錄了系統行為的時間、地點、狀態等相關資訊,能夠幫助我們瞭解並監控系統狀態
②:進行統計
③:進行Debug,在系統產生問題時,能夠幫助我們快速的定位、診斷並解決問題。
在發生錯誤或者接近某種危險狀態時能夠及時提醒我們處理
常用的日誌框架類別簡介:
- Log4j Apache Log4j是一個基於Java的日誌記錄工具。它是由Ceki Gülcü首創的,現在則是Apache軟體基金會的一個專案。 Log4j是幾種Java日誌框架之一。
- Log4j 2 Apache Log4j 2是apache開發的一款Log4j的升級產品,Log4j被apache收購,升級,改為log4j2,框架改動很大,只是借用之名。
- JCL (Jakarta Commons Logging) Apache基金會所屬的專案,是一套Java日誌介面,之前叫Jakarta Commons Logging,後更名為Commons Logging。
- Slf4j(Simple Logging Facade for Java) 類似於Commons Logging,是一套簡易Java日誌門面,本身並無日誌的實現。
- Logback 一套日誌元件的實現(slf4j陣營)。
- JUL (Java Util Logging),自Java1.4以來的官方日誌實現,已被淘汰。
- jboss-logging 等。
Spring框架內部使用的日誌框架是 JCL (Jakarta Commons Logging)
Mybatis框架中使用的是 Log4j
Hibernate框架中使用的是 jboss-logging
Springboot底層使用的是 SLF4j + Logback
(Log4j,Logback,SLF4j都是同一個作者。)
問題引入:
市場上存在非常多的日誌框架。每一種日誌框架都有自己單獨的API,要使用對應的框架就要使用其對應的API,這就大大的增加應用程式程式碼對於日誌框架的耦合性。
解決思路:
為了解決上述問題,就在日誌框架和應用程式之間架設一個溝通的橋樑,對於應用程式來說,無論底層的日誌框架如何變,都不需要有任何感知。只要門面服務做的足夠好,隨意換另外一個日誌框架,應用程式不需要修改任意一行程式碼,就可以直接上線。
在軟體開發領域有這樣一句話:電腦科學領域的任何問題都可以通過增加一個間接的中間層來解決。而門面模式就是對於這句話的典型實踐。
Logback文件免費。Logback的所有文件是全面免費提供的,不象Log4J那樣只提供部分免費文件而需要使用者去購買付費文件。Logback擁有更好的效能。
因為springboot底層使用的是 SLF4j + Logback,而且平時開發中使用頻率最高的也是此組合,所以選擇使用此組合進行日誌框架的整合。
可能出現的問題:
如果我們直接暴力的排除其他日誌框架,可能導致第三方庫在呼叫日誌介面時丟擲 ClassNotFound 異常,這裡就需要用到中間轉換包。
中間轉換包說白了就是一種偷天換日的解決方案。比如 log4j-over-slf4j ,即 log4j -> slf4j 的轉換包,這個庫定義了與 log4j一致的介面(包名、類名、方法簽名均一致),但是介面的實現卻是對 slf4j 日誌介面的包裝,即間接呼叫了 slf4j 日誌介面,實現了對日誌的轉發。
解決方案:
①:先排除其他日誌包
②:在專案中引入 slf4j 的 轉換包
③:在專案中引入 slf4j+logback 依賴+ logback的配置檔案
在專案中引入 slf4j的 轉換包
<!-- https://mvnrepository.com/artifact/org.slf4j/log4j-over-slf4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId><!-- 替換log4j --> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId><!-- 替換commons-logging --> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jul-to-slf4j</artifactId><!-- 替換java.util.logging --> <version>1.7.25</version> </dependency>
在專案中引入slf4j+logback 依賴
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.6</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.6</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency>
logback.xml配置檔案
< ?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> </encoder> </appender> <root level="WARN"> <appender-ref ref="STDOUT" /> </root> <!-- 日誌:從低到高;只會列印指定級別以後的; additivity表示是否將日誌資訊反饋給root DEBUG==》INFO===》WARN===》ERROR Additivity:false,避免重複列印日誌 --> <!-- 在自己的專案在中設定列印日誌的級別,開發時使用--> <logger name="com.xxx.xxx" level="DEBUG" additivity="false"> <appender-ref ref="STDOUT"/> </logger> </configuration>
參考連結:
slf4j官網
slf4j使用手冊
logback官網
Commons Logging官網
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。