java slf4j日誌管理
SLF4J,即簡單日誌門面(Simple Logging Facade for Java),不是具體的日誌解決方案,它只服務於各種各樣的日誌系統。按照官方的說法,SLF4J是一個用於日誌系統的簡單Facade,允許終端使用者在部署其應用時使用其所希望的日誌系統。
實際上,SLF4J所提供的核心API是一些介面以及一個LoggerFactory的工廠類。從某種程度上,SLF4J有點類似JDBC,不過比JDBC更簡單,在JDBC中,你需要指定驅動程式,而在使用SLF4J的時候,不需要在程式碼中或配置檔案中指定你打算使用那個具體的日誌系統。如同使用JDBC基本不用考慮具體資料庫一樣,SLF4J提供了統一的記錄日誌的介面,只要按照其提供的方法記錄即可,最終日誌的格式、記錄級別、輸出方式等通過具體日誌系統的配置來實現,因此可以在應用中靈活切換日誌系統。
驅動和橋接
log4j是一個日誌系統。
slf4j是一個日誌系統的封裝,對外提供統一的API
使用slf4j需要下載slf4j-api-x.x.x.jar 它提供對外一致的API介面,其本身不提供日誌實現。假設我們選擇log4j作為我們的日誌實現,需要下載log4j-x.x.x.jar如果想把slf4j繫結log4j,則需要下載slf4j對log4j的相應”驅動”。slf4j-log4j12-x.x.x.jar這樣就可以使用slf4j提供的API,用log4j實現打日誌了。所謂驅動,就是實現了slf4j的一些介面,用你喜歡的日誌系統打日誌。slf4j還支援好多日誌系統,並提供了相應的“驅動”包
例如:
slf4j-jdk14-x.x.x.jar是為java.util.logging提供的驅動
slf4j-simple-x.x.x.jar直接繫結System.errlf4j-jcl-x.x.x.jar是為commons-logging提供的驅動
logback-classic-x.x.x.jar是為logback提供的驅動
如果你引入了一個第三方jar包或者你之前的工程使用了commons-logging打日誌。你想換成slf4j,你不需要更改程式碼,你需要使用橋接,你可以引入jcl-over-slf4j.jar,同時去掉commons-logging.jar包,這樣之前打的日誌會自動切換到你的slf4j中來了。同樣還有log4j-over-slf4j.jar and jul-to-slf4j.jar等用於使用其它日誌系統的應用自動切換到slf4j統一打日誌。
這裡其實用到了一種設計模式(Facade設計模式,門面設計模式)。如下圖:
例項1:SLF4J+simple
匯入:slf4j-api-1.7.21.jar 包
1.新建一個java類slf4jSimpleTest
package com.slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class slf4jSimpleTest{ public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info("Hello World"); } }
2. 發現執行的時候,出錯了。提示Failed to load class “org.slf4j.impl.StaticLoggerBinder”。說明預設的情況下SLF4J會去找預設的實現類。
匯入slf4j-simple-1.7.21.jar包
重新執行程式,發現正確輸出。結果如下:
[main] INFO com.souvc.log.slf4j.HelloWorld - Hello World
使用slf4j這種記錄日誌的方式的特點很明顯:1、如果我們需要記錄的是底層類庫或者元件這種東西,就可以不影響或強制要求使用者選擇哪種日誌系統。2、如果我們用特定的日誌系統寫了程式碼,但是有一天要求換另一種日誌系統,如果之前就用slf4j的api寫的,那就很簡單,但是如果用具體的一種方式寫了以後,那在切換就很麻煩。
例項2:
package com.slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jTest {
// 首先獲得日誌記錄這個物件
static private Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
public static void main(String[] args) {
// 記錄error資訊
logger.error("[info message]");
// 記錄info,還可以傳入引數
logger.info("[info message]{},{},{},{}", "abc", false, 123, new Slf4jTest());
// 記錄debug資訊
logger.debug("[debug message]");
// 記錄trace資訊
logger.trace("[trace message]");
}
}
具體使用哪種日誌系統,這個可以隨意切換,切換方式就是將我們的jar包替換成切換的模式
(1)使用slf4j的simple日誌系統:
在classpath中加入:slf4j-simple.jar
在classpath中將slf4j-logo.jar換成slf4j-jdk.jar
(3)切換成log4j的日誌系統:
在classpath中將slf4j-logo.jar換成slf4j-log4j.jar,注意這在使用log4j的時候,需要自己配置log4j.properites檔案或者log4j.xml。
切換成其他的日誌,方法都是一樣的,直接替換相關日誌jar包就可以了。
如果classpath中有多種日誌系統,slf就會將每個系統的日誌資訊都顯示出來,這樣的話我們就沒辦法分辨出,這樣會很亂