Commons Logging 架構分析

#0 系列目錄#apache

Jakarta Commons Logging (JCL)提供的是一個日誌(Log)接口(interface),同時兼顧輕量級和不依賴於具體的日誌實現工具。它提供給中間件/日誌工具開發者一個簡單的日誌操做抽象,容許程序開發人員使用不一樣的具體日誌實現工具。設計模式

#1 類圖#緩存

  • (1)Commons Logging定義了一個本身的接口 org.apache.commons.logging.Log,以屏蔽不一樣日誌框架的API差別,這裏其實就是用到了Adapter Pattern(適配器模式)

輸入圖片說明

上面的UML類圖,只是列出了幾個經常使用的適配器實現類,當前Commons Logging 1.1.1版本已經實現的適配器實現類有:架構

  1. org.apache.commons.logging.impl.AvalonLogger。
  2. org.apache.commons.logging.impl.Jdk13LumberjackLogger。
  3. org.apache.commons.logging.impl.Jdk14Logger。
  4. org.apache.commons.logging.impl.Log4JLogger。
  5. org.apache.commons.logging.impl.LogKitLogger。
  6. org.apache.commons.logging.impl.NoOpLog。 它很懶,什麼也不作,全部給它的日誌信息直接丟棄
  7. org.apache.commons.logging.impl.SimpleLog。將日誌信息輸出至控制檯,建議只是用於開發環境,不要用於生產環境。
  • (2)Commons Loggins 經過一個抽象工廠類 LogFactory 實現配置文件的加載解析以及實例化日誌框架類。這裏面就用到了兩個經常使用的設計模式:Factory Pattern(工廠模式)、Single Pattern(單例模式)

輸入圖片說明

同時,Commons Logging 實現了一個默認的工廠類 org.apache.commons.logging.impl.LogFactoryImpl,在未指明工廠實現類的狀況下就使用它。框架

有必要詳細說明一下調用LogFactory.getLog()時發生的事情調用該函數會啓動一個發現過程,即找出必需的底層日誌記錄功能的實現,具體的發現過程在下面列出:函數

  1. Commons的Logging首先在CLASSPATH中查找commons-logging.properties文件。這個屬性文件至少定義 org.apache.commons.logging.Log屬性,它的值應該是上述任意Log接口實現的完整限定名稱。若是找到 org.apache.commons.logging.Log屬相,則使用該屬相對應的日誌組件。結束髮現過程
  2. 若是上面的步驟失敗(文件不存在或屬相不存在),Commons的Logging接着檢查系統屬性 org.apache.commons.logging.Log。若是找到org.apache.commons.logging.Log系統屬性,則使用該系統屬性對應的日誌組件。結束髮現過程。
  3. 若是找不到org.apache.commons.logging.Log系統屬性,Logging接着在CLASSPATH中尋找log4j的類。若是找到了,Logging就假定應用要使用的是log4j。不過這時log4j自己的屬性仍要經過log4j.properties文件正確配置。結束髮現過程。
  4. 若是上述查找均不能找到適當的Logging API,但應用程序正運行在JRE 1.4或更高版本上,則默認使用JRE 1.4的日誌記錄功能。結束髮現過程。
  5. 最後,若是上述操做都失敗(JRE 版本也低於1.4),則應用將使用內建的SimpleLogSimpleLog把全部日誌信息直接輸出到System.err。結束髮現過程。

以上發現過程,具體源碼分析,請參見Commons Logging使用原理工具

#2 實現原理#源碼分析

  • (1)完整的配置文件內容:
# 默認值true
org.apache.commons.logging.Log.allowFlawedContext=true
# 默認值true
org.apache.commons.logging.Log.allowFlawedDiscovery=true
# 默認值true
org.apache.commons.logging.Log.allowFlawedHierarchy=true
# 默認值false
use_tccl=false
# 默認值0
priority=0
configId=
# 默認值
org.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.LogFactoryImpl
org.apache.commons.logging.Log=
org.apache.commons.logging.diagnostics.dest=STDERR

實際中使用的時候只須要配置 org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger,或者其餘的適配器實現類以及根據項目實際須要實現的自定義適配器類。.net

  • (2)使用方法:
private Log logger = LogFactory.getLog(Hello.class);  
或 
private Log logger = LogFactory.getLog("Hello");

它的執行序列圖以下:設計

輸入圖片說明

  1. 首先從緩存中獲取工廠實現類實例,若是沒有就讀取配置文件中的配置項 org.apache.commons.logging.LogFactory 獲取工廠實現類並進行實例化,若是沒有配置或者找不到對應的類,就使用默認的工廠類 org.apache.commons.logging.impl.LogFactoryImpl 進行初始化並放入緩存
  2. 根據」name「從緩存中獲取日誌適配器實現類實例,若是沒有就新生成一個並放入緩存
相關文章
相關標籤/搜索