若是對於commons-loging、log4j、slf4j、LogBack等都已經很是清楚了,能夠忽略本文。幾回解決日誌衝突問題時對這幾個概念的簡單總結,但願對這塊基礎沒有理解透的同窗能有所幫助,固然若是對這塊有更深入理解的同窗,也貢獻出本身的知識和看法。html
1、 概念java
Commons-logging:apache最先提供的日誌的門面接口。避免和具體的日誌方案直接耦合。相似於JDBC的api接口,具體的的JDBC driver實現由各數據庫提供商實現。經過統一接口解耦,不過其內部也實現了一些簡單日誌方案。數據庫
Log4j:經典的一種日誌解決方案。內部把日誌系統抽象封裝成Logger、appender、pattern等實現。咱們能夠經過配置文件輕鬆的實現日誌系統的管理和多樣化配置。apache
Slf4j: 全稱爲Simple Logging Facade for JAVA:java簡單日誌門面。是對不一樣日誌框架提供的一個門面封裝。能夠在部署的時候不修改任何配置便可接入一種日誌實現方案。和commons-loging應該有同樣的初衷。我的感受設從計上更好一些,沒有commons那麼多潛規則。同時有兩個額外特色:api
1. 能支持多個參數,並經過{}佔位符進行替換,避免老寫logger.isXXXEnabled這種無奈的判斷,帶來性能提高見:http://www.slf4j.org/faq.html#logging_performance。app
2.OSGI機制更好兼容支持框架
一圖勝千言,官網上的一個圖:性能
從上圖能夠發現,選擇仍是不少的。測試
Logback: Lack做爲一個通用可靠、快速靈活的日誌框架,將做爲Log4j的替代和SLF4J組成新的日誌系統的完整實現。官網上稱具備極佳的性能,在關鍵路徑上執行速度是log4j的10倍,且內存消耗更少。spa
2、 SLF4J 的幾種實際應用模式--之一:SLF4J+Log4J
SLF4J(Simple Logging Facade for Java) 是一個通用的日誌框架,不能何以謂之 Facade(門面),所扮眼的角色至關於 Jakarta Commons Logging。就像 JCL 須要底層的日誌實現,如 Log4J、java.util.logging、Simple Logger 等來完成具體的信息輸出,事實上基本老是 JCL+Log4J 那麼一個絕配。SLF4J 的原旨也是能支持多種下層日誌框架實現,但最好的日誌實現仍然是 Log4J,因此本篇講述 SLF4J 的第一種用法 SLF4J+Log4J。
須要的配置文件和組件包,下面三個 jar 文件和一個 properties 文件都是要放在項目的 ClassPath 上。
1. slf4j-api-1.5.11.jar
2. slf4j-log4j12-1.5.11.jar
3. log4j-1.2.15.jar
4. log4j.properties(也能夠是 log4j.xml,本例中用 log4j.propertes)
前兩個包在 http://www.slf4j.org/download.html 處下載,後一個包在http://logging.apache.org/log4j/1.2/download.html 下載,可能包文件名中的版本號有些差,沒關係。
log4j.properties 之前該是怎麼寫,如今仍是怎麼寫,好比一個最簡單的內容,只向控制檯輸出日誌信息,以下:
[xml] view plain copy
3、 SLF4J 的幾種實際應用模式--之一:SLF4J+Logback
前面講的 SLF4J 的用法之一是 SLF4J+Log4J,而這裏要推出的組合是 SLF4J+LogBack。不用 Log4J?難道還有比 Log4J 更好的日誌實現嗎?是的,答案就是LogBack。假如你知道 LogBack 和 Log4J 是同出一位大師之手,你就不會以爲驚訝了。LogBack 對 Log4J 進行了加強,並投入了 SLF4J 的懷抱,它還被做者認定爲 Log4J 的繼任者。
爲何叫作 Logback,我就不知道了,反正不要叫作 Brokeback 就行。這裏是推崇用 Logback 替代 Log4J 的十幾個理由:Reasons to prefer logback over log4j,說的大至是更快;好測試;與 SLF4J 關係緊;文檔豐富;能自動加載配置文件;多個 JVM 寫一個日誌文件,或其餘 I/O 錯誤時不影響程序執行;配置文件中加入條件控制;強大的日誌過濾;更強的日誌切分功能;自動壓縮、刪除日誌文件;異常棧中更多的數據信息。
Logback 分爲三個模塊:logback-core,logback-classic,logback-access。logback-core 是核心;logback-classic 改善了 log4j,且自身實現了 SLF4J API,因此即便用 Logback 你仍然可使用其餘的日誌實現,如原始的 Log4J,java.util.logging 等;logback-access 讓你方便的訪問日誌信息,如經過 http 的方式。
還得提一點,Logback 能更好的放到 OSGI 環境中。好了,簡單紹完了 Logback,就來看看具體怎麼用它。
須要的配置文件和組件包,下面三個 jar 文件和一個 xml文件都是要放在項目的 ClassPath 上。
1. slf4j-api-1.5.11.jar
2. logback-core-0.9.20.jar
3. logback-classic-0.9.20.jar
4. logback.xml 或 logback-test.xml (相似於 log4j.properties/log4j.xml)
4、SLF4J怎樣定位到具體用哪一個log
在應用中,經過LoggerFactory類的靜態getLogger()獲取logger。經過查看該類的代碼能夠看出,最終是經過StaticLoggerBinder.SINGLETON.getLoggerFactory()方法獲取LoggerFactory而後,在經過該具體的LoggerFactory來獲取logger的。類org.slf4j.impl.StaticLoggerBinder並不在slf4j-api-1.5.2.jar包中,仔細查看每一個與具體日誌系統對應的jar包,就會發現,相應的jar包都有一個org.slf4j.impl.StaticLoggerBinder的實現,不一樣的實現返回與該日誌系統對應的LoggerFactory,所以就實現了所謂的靜態綁定,達到只要選取不一樣jar包就能簡單靈活配置的目的。