Java日誌框架SLF4J和log4j以及logback的聯繫和區別

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?

  •  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 …..」)
關於如何單獨使用log4j,建議詳細閱讀如下文章:
https://blog.csdn.net/u012422446/article/details/51199724
https://blog.csdn.net/azheng270/article/details/2173430/
http://shmilyaw-hotmail-com.iteye.com/blog/2410764
3.logback

 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.總結以下:

一、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經常使用日誌框架介紹)

相關文章
相關標籤/搜索