1.SLF4J(Simple logging Facade for Java)
意思為簡單日志門面,它是把不同的日志系統的實現進行了具體的抽象化,只提供了統一的日志使用接口,使用時只需要按照其提供的接口方法進行調用即可,由於它只是一個接口,並不是一個具體的可以直接單獨使用的日志框架,所以最終日志的格式、記錄級別、輸出方式等都要通過接口綁定的具體的日志系統來實現,這些具體的日志系統就有log4j,logback,java.util.logging等,它們才實現了具體的日志系統的功能。
如何使用SLF4J?
既然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包情況為:
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
SLF4J和simple(SLF4J本身提供的一個接口的簡單實現)結合使用時需要提供的jar:slf4j-api.jar,slf4j-simple.jar
當然還有其他的日志實現包,以上是經常會使用到的一些。
注意,以上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?
- slf4j是一個日志接口,自己沒有具體實現日志系統,只提供了一組標准的調用api,這樣將調用和具體的日志實現分離,使用slf4j后有利於根據自己實際的需求更換具體的日志系統,比如,之前使用的具體的日志系統為log4j,想更換為logback時,只需要刪除log4j相關的jar,然后加入logback相關的jar和日志配置文件即可,而不需要改動具體的日志輸出方法,試想如果沒有采用這種方式,當你的系統中日志輸出有成千上萬條時,你要更換日志系統將是多么龐大的一項工程。如果你開發的是一個面向公眾使用的組件或公共服務模塊,那么一定要使用slf4的這種形式,這有利於別人在調用你的模塊時保持和他系統中使用統一的日志輸出。
- slf4j日志輸出時可以使用{}占位符,如,logger.info("testlog: {}", "test"),而如果只使用log4j做日志輸出時,只能以logger.info("testlog:"+"test")這種形式,前者要比后者在性能上更好,后者采用+連接字符串時就是new 一個String 字符串,在性能上就不如前者。
2.log4j(log for java)
Log4j是Apache的一個開源項目,通過使用Log4j,我們可以控制日志信息輸送的目的地是控制台、文件、GUI組件,甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;我們也可以控制每一條日志的輸出格式;通過定義每一條日志信息的級別,我們能夠更加細致地控制日志的生成過程。最令人感興趣的就是,這些可以通過一個配置文件來靈活地進行配置,而不需要修改應用的代碼。
如何使用?
- 引入jar,使用log4j時需要的jar為:log4j.jar。
- 定義配置文件log4j.properties或log4j.xml
- 在具體的類中進行使用:
- 在需要日志輸出的類中加入:private static final Logger logger = Logger.getLogger(Tester.class); //通過Logger獲取Logger實例
- 在需要輸出日志的地方調用相應方法即可:logger.debug(“System …..”)
logback同樣是由log4j的作者設計完成的,擁有更好的特性,用來取代log4j的一個日志框架,是slf4j的原生實現(即直接實現了slf4j的接口,而log4j並沒有直接實現,所以就需要一個適配器slf4j-log4j12.jar),logback一共有以下幾個模塊:
- logback-core:其它兩個模塊的基礎模塊
- logback-classic:它是log4j的一個改良版本,同時它完整實現了slf4j API使你可以很方便地更換成其它日志系統如log4j或JDK14 Logging
- logback-access:訪問模塊與Servlet容器集成提供通過Http來訪問日志的功能
同樣,單獨使用它時,需要引入以上jar,然后進行配置文件的配置,最后就是在相關類中進行使用,使用時加入以下語句:
private final static Logger logger = LoggerFactory.getLogger(Test.class);
logger.info("打印日志");
對於logback的使用,詳細使用方法及配置推薦閱讀以下文章:
https://www.cnblogs.com/warking/p/5710303.html
4.總結如下:
1、slf4j是java的一個日志門面,實現了日志框架一些通用的api,log4j和logback是具體的日志框架。
2、他們可以單獨的使用,也可以綁定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常用日志框架介紹)