1.SLF4J(Simple logging Facade for Java)html
意思爲簡單日誌門面,它是把不一樣的日誌系統的實現進行了具體的抽象化,只提供了統一的日誌使用接口,使用時只須要按照其提供的接口方法進行調用便可,因爲它只是一個接口,並非一個具體的能夠直接單獨使用的日誌框架,因此最終日誌的格式、記錄級別、輸出方式等都要經過接口綁定的具體的日誌系統來實現,這些具體的日誌系統就有log4j,logback,java.util.logging等,它們才實現了具體的日誌系統的功能。java
如何使用SLF4J?api
既然SLF4J只是一個接口,那麼實際使用時必需要結合具體的日誌系統來使用,咱們首先來看SLF4J和各個具體的日誌系統進行綁定時的框架原理圖:服務器
其實slf4j原理很簡單,他只提供一個核心slf4j api(就是slf4j-api.jar包),這個包只有日誌的接口,並無實現,因此若是要使用就得再給它提供一個實現了些接口的日誌包,比 如:log4j,common logging,jdk log日誌實現包等,可是這些日誌實現又不能經過接口直接調用,實現上他們根本就和slf4j-api不一致,所以slf4j又增長了一層來轉換各日誌實現包的使 用,固然slf4j-simple除外。其結構以下:
slf4j-api(接口層)
|
各日誌實現包的鏈接層( slf4j-jdk14, slf4j-log4j)
|
各日誌實現包 框架
因此,結合各日誌實現包使用時提供的jar包狀況爲:iphone
SLF4J和logback結合使用時須要提供的jar:slf4j-api.jar,logback-classic.jar,logback-core.jar工具
SLF4J和log4j結合使用時須要提供的jar:slf4j-api.jar,slf4j-log412.jar,log4j.jar性能
SLF4J和JDK中java.util.logging結合使用時須要提供的jar:slf4j-api.jar,slf4j-jdk14.jar.net
SLF4J和simple(SLF4J自己提供的一個接口的簡單實現)結合使用時須要提供的jar:slf4j-api.jar,slf4j-simple.jardebug
固然還有其餘的日誌實現包,以上是常常會使用到的一些。
注意,以上slf4j和各日誌實現包結合使用時最好只使用一種結合,否則的話會提示重複綁定日誌,而且會致使日誌沒法輸出。
slf4j-api.jar:對外提供統一的日誌調用接口,該接口具體提供的調用方式和方法舉例說明:
public class Test {
private static final Logger logger = LoggerFactory.getLogger(Tester.class); //經過LoggerFactory獲取Logger實例
public static void main(String[] args) {
//接口裏的統一的調用方法,各具體的日誌系統都有實現這些方法
logger.info("testlog: {}", "test");
logger.debug("testlog: {}", "test");
logger.error("testlog: {}", "test");
logger.trace("testlog: {}", "test");
logger.warn("testlog: {}", "test");
}
}
若是系統中以前已經使用了log4j作日誌輸出,想使用slf4j做爲統一的日誌輸出,該怎麼辦呢?
若是以前系統中是單獨使用log4j作爲日誌輸出的,這時再想使用slf4j作爲日誌輸出時,若是系統中日誌比較多,此時更改日誌輸出方法確定是不太現實的,這個時候就可使用log4j-over-slf4j.jar將使用log4j日誌框架輸出的日誌路由到slf4j上來統一採用slf4j來輸出日誌。
爲何要使用SLF4J?
2.log4j(log for java)
Log4j是Apache的一個開源項目,經過使用Log4j,咱們能夠控制日誌信息輸送的目的地是控制檯、文件、GUI組件,甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;咱們也能夠控制每一條日誌的輸出格式;經過定義每一條日誌信息的級別,咱們可以更加細緻地控制日誌的生成過程。最使人感興趣的就是,這些能夠經過一個配置文件來靈活地進行配置,而不須要修改應用的代碼。
如何使用?
logback一樣是由log4j的做者設計完成的,擁有更好的特性,用來取代log4j的一個日誌框架,是slf4j的原生實現(即直接實現了slf4j的接口,而log4j並無直接實現,因此就須要一個適配器slf4j-log4j12.jar),logback一共有如下幾個模塊:
一樣,單獨使用它時,須要引入以上jar,而後進行配置文件的配置,最後就是在相關類中進行使用,使用時加入如下語句:
private final static Logger logger = LoggerFactory.getLogger(Test.class);
logger.info("打印日誌");
對於logback的使用,詳細使用方法及配置推薦閱讀如下文章:
https://www.cnblogs.com/warking/p/5710303.html
4.總結以下:
一、slf4j是java的一個日誌門面,實現了日誌框架一些通用的api,log4j和logback是具體的日誌框架。
二、他們能夠單獨的使用,也能夠綁定slf4j一塊兒使用。
單獨使用,分別調用框架本身的方法來輸出日誌信息。綁定slf4j一塊兒使用。調用slf4j的api來輸入日誌信息,具體使用與底層日誌框架無關(須要底層框架的配置文件)。顯然不推薦單獨使用日誌框架。假設項目中已經使用了log4j,而咱們此時加載了一個類庫,而這個類庫依賴另外一個日誌框架。這個時候咱們就須要維護兩個日誌框架,這是一個很是麻煩的事情。而使用了slf4j就不一樣了,因爲應用調用的抽象層的api,與底層日誌框架是無關的,所以能夠任意更換日誌框架。
這篇文章主要是來幫你們理清 slf4j,log4j,logback之間的關係,對於使用及相關配置文件的詳細配置不作說明,對於具體的使用參考文章末尾相關參考連接。
最後,送上slf4j和log4j整合使用時的一些參考連接
https://blog.csdn.net/javaloveiphone/article/details/52486257 (log橋接工具jcl-over-slf4j使用,項目排除commons-logging依賴的影響)
https://blog.csdn.net/minicto/article/details/52672472
https://blog.csdn.net/foreverling/article/details/51385128
https://www.cnblogs.com/junzi2099/p/7930268.html#_label6
https://www.cnblogs.com/chenhongliang/p/5312517.html (java經常使用日誌框架介紹)