上文描述了如何在Apusic AS的Web應用中調用LogJ有些朋友會覺得LogJ使用前還需要初始化比較麻煩還有些朋友會說怎麼你這個LogJ使用起來那麼復雜我們的項目都沒有那麼過程呀?那是因為許多Web應用中是用Java commonslogging(JCL)+LogJ的如果采用JCL+LogJ就不需要初始化了
那麼為什麼有了LogJ又有JCL呢?是因為SUN的JDK 中自帶有日志框架LogJ是Apache提供的日志框架為了擴展應用的兼容性保證應用可以無縫切換到不同的日志框架因此JCL提供的是日志系統的接口通過給工廠接口提供不同的實現類從而保證與不同日志框架的兼容同時為了保證系統的有效性還提供了一個非常簡單的日志框架實現以便沒有外接其他日志框架時可以使用自帶的
那麼為什麼JCL+LogJ就不需要初始化了呢?這要從JCL的執行流程說起當應用執行類似以下代碼時
import monsloggingLog; import monsloggingLogFactory;
public class LoggingDemo { private static Log log = LogFactorygetLog(LoggingDemoclass); // } LogFactorygetLog()函數會啟動一個搜索過程找出底層日志記錄功能的實現具體的發現過程在下面列出
⑴ Commons的Logging首先在CLASSPATH中尋找一個commonsloggingproperties文件這個屬性文件至少定義monsloggingLog屬性它的值應該是實現Log接口的完整限定名稱
⑵ 如果上面的步驟失敗Commons的Logging接著檢查系統屬性monsloggingLog以便找到實現Log接口的完整限定名稱屬性可以通過服務器啟動時參數配置或者在代碼中使用SystemsetProperty()函數操作具體可以參考附件
⑶ 如果找不到monsloggingLog系統屬性Logging接著在CLASSPATH中尋找logj的類如果找到了Logging就假定應用要使用的是logjlogj本身的屬性需要按照框架配置文件定義的方式進行一般是通過logjproperties文件正確配置
⑷ 如果上述查找均不能找到適當的Logging API但應用程序正運行在JRE 或更高版本上則默認使用JRE 的日志記錄功能
⑸ 最後如果上述操作都失敗則應用將使用內建的SimpleLogSimpleLog把所有日志信息直接輸出到Systemerr
了解了以上的過程就會明白為什麼JCL+LogJ不再需要初始化使用JCL+LogJ只需要在WEBINF/lib下放置commonsloggingjar和logjjar包在WEBINF/classes下放置logjproperties和commonsloggingproperties(可選)文件就可以在程序中隨意的使用了
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25794.html