第1、Logger.getLogger()和LogFactory.getLog()的區別
1.Logger.getLogger()是使用log4j的方式記錄日誌;html
2.LogFactory.getLog()則來自apache的common-logging包。mysql
common-logging組件:
Jakarta Commons Logging (JCL)提供的是一個日誌(Log)接口(interface),同時兼顧輕量級和不依賴於具體的日誌實現工具。它提供給中間件/日誌工具開發者一個簡單的日誌操做抽象,容許程序開發人員使用不一樣的具體日誌實現工具。瞭解包裏狀況,能夠查看它的API文檔:http://www.oschina.net/uploads/doc/commons-logging-1.1.1/index.html , 其中Log(基本記錄器)和LogFactory(負責建立Log實例)是兩個基類。該API直接提供對下列底層日誌記錄工具的支持:Jdk14Logger,Log4JLogger,LogKitLogger,NoOpLogger (直接丟棄全部日誌信息),還有一個SimpleLog。 有必要詳細說明一下調用LogFactory.getLog()時發生的事情。調用該函數會啓動一個發現過程,即找出必需的底層日誌記錄功能的實現,具體的發現過程在下面列出: ( 換句話說就是, 有這麼多工具,common-logging該使用哪個呢?這取決於系統的設置,common-logging將按如下順序決定使用哪一個日誌記錄工具:)web
(1).common-logging首先在CLASSPATH中查找commons-logging.properties文件。這個屬性文件至少定義org.apache.commons.logging.Log屬性,它的值應該是上述任意Log接口實現的完整限定名稱。若是找到 org.apache.commons.logging.Log屬相,則使用該屬相對應的日誌組件。結束髮現過程。sql
(2).若是上面的步驟失敗(文件不存在或屬相不存在),common-logging接着檢查系統屬性org.apache.commons.logging.Log。若是找到org.apache.commons.logging.Log系統屬性,則使用該系統屬性對應的日誌組件。結束髮現過程。
(3).若是找不到org.apache.commons.logging.Log系統屬性,common-logging接着在CLASSPATH中尋找log4j的類。若是找到了就假定應用要使用的是log4j。不過這時log4j自己的屬性仍要經過log4j.properties文件正確配置。結束髮現過程。
(4).若是上述查找均不能找到適當的Logging API,但應用程序正運行在JRE 1.4或更高版本上,則默認使用JRE 1.4的日誌記錄功能。結束髮現過程。
(5).最後,若是上述操做都失敗(JRE 版本也低於1.4),則應用將使用內建的SimpleLog。SimpleLog把全部日誌信息直接輸出到System.err。結束髮現過程。數據庫
爲了簡化配置 commons-logging ,通常不使用 commons-logging 的配置文件,也不設置與 commons-logging 相關的系統環境變量,而只需將 Log4j 的 Jar 包放置到 classpash 中就能夠了。這樣就很簡單地完成了 commons-logging 與 Log4j 的融合。apache
根據不一樣的性質,日誌信息一般被分紅不一樣的級別,從低到高依次是:「調試( DEBUG )」「信息( INFO )」「警告( WARN )」「錯誤(ERROR )」「致命錯誤( FATAL )」。網絡
舉例說明:架構
基於common-logging的運行方式:app
基於log4j的運行方式
第2、詳細介紹Log4j
① Log4j的架構
Log4j系統的三大板塊:日誌寫入器、日誌輸出終端、日誌佈局模式
Logger類是日誌包的核心,Logger的名稱是大小寫敏感的,而且名稱之間有繼承關係。子名由父名作前綴,用點號「.」分隔,如x.y是x.y.z的父親Logger。Logger系統中有個根logger,是全部logger的祖先,它老是存在的,而且不能夠經過名字獲取,能夠經過Logger.getRootLogger()來獲取。獲取Logger對象的方法不少,能夠參考API文檔,在某對象中,用該對象所屬的類做爲參數,調用Logger.getLogger(Class clazz)以獲取logger對象被認爲是目前所知最理智的命名logger方法。
②Log4j的日誌級別(Level)
每一個logger都有一個日誌級別,用來控制日誌的輸出。未分配級別的logger將自動繼承它最近的父logger的日誌級別。Logger的由低到高級別以下:
ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF
③Log4j的輸出終端(Appender接口)
Log4j提供瞭如下幾個實現:
默認狀況下,子logger將繼承父logger的全部appenders。
④Log4j的輸出佈局模式(Layout接口)
Log4j提供Layout有如下幾種:
Log4j採用相似C語言中的printf函數的打印格式格式化日誌信息。打印參數以下:
⑤Log4j的配置
在實際使用中,Log4j通常是經過配置文件配置使用的。配置文件有兩種,Java properties和XML文件。通常都選用properties文件來配置,由於簡潔易讀。下面只介紹Java properties的配置方式。
對Log4j的配置就是對rootLogger和子Logger的配置。主要的配置項爲:rootLogger、輸出終端、輸出佈局模式,全部的配置項都必須以log4j開頭。
配置文件的示例