1. 程式人生 > 其它 >Java日誌框架SLF4J和log4j以及logback的聯絡和區別

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

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的事件記錄器、UNIXSyslog守護程序等;我們也可以控制每一條日誌的輸出格式;通過定義每一條日誌資訊的級別,我們能夠更加細緻地控制日誌的生成過程。最令人感興趣的就是,這些可以通過一個配置檔案來靈活地進行配置,而不需要修改應用的程式碼。

如何使用?

  • 引入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.總結如下:

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

轉自:https://www.cnblogs.com/hanszhao/p/9754419.html