?? (Jarkata 的 Commons Logging 包現(xiàn)在已經(jīng)被用在幾乎所有的開源項目之中,它可以使你開發(fā)的系統(tǒng)工作在不同的日志框架下,包括Sun的logging框架和Apache Log4j。現(xiàn)在Commons Logging + Apache Log4j 的身影是隨處可見,Commons Logging 的易用與Log4j的強大功能形成了絕配。)
問題:
??? ? 你正在寫一個可重用的代碼庫,而你不知道你的代碼在哪里并且是如何工作的。你需要一個抽象的日志接口來寫入日志信息,因為你不能確定Log4j或者是JDK 1.4 logging的存在性。
解決:
??????? 通過Jakarta Commons Logging 的Log 接口來記錄信息,然后依靠Commons Logging自身來決定在運行時使用哪種具體的日志框架。下面的代碼使用了Log接口來記錄trace,debug,info,warning,error和fatal信息:
?1?import?org.apache.commons.logging.LogFactory;
?2?import?org.apache.commons.logging.Log
?3?
?4?Log?log?=?LogFactory.getLog(?"com.discursive.jccook.SomeApp"?);?
?5?
?6?if(?log.isTraceEnabled(?)?)?{
?7?????log.trace(?"This?is?a?trace?message"?);
?8?}
?9?
10?if(?log.isDebugEnabled(?)?)?{
11?????log.debug(?"This?is?a?debug?message"?);
12?}
13?
14?log.info(?"This?is?an?informational?message"?);
15?
16?log.warn(?"This?is?a?warning"?);
17?
18?log.error(?"This?is?an?error"?);
19?
20?log.fatal(?"This?is?fatal"?);
????? LogFactory.getInstance() 返回一個Log接口的具體實現(xiàn),這個實現(xiàn)與底層具體的日志框架相對應。例如,如果你的系統(tǒng)是使用Apache Log4j ,一個Log4JLogger將被返回,對應于Log4J category
com.discursive.jccook.SomeApp 。
討論:
??????? 一個可重用代碼庫的開發(fā)者不能預知其代碼庫將在何時何地被用到,而現(xiàn)在有很多的日志框架可以使用,所以當開發(fā)可重用代碼庫的時候,使用Commons Logging 是非常明智的,例如Jakarta Commons 組件。當調用LogFactory.getInstance()方法的時候,Commons Logging 將通過系統(tǒng)屬性和classpath中的類庫來決定和管理適當?shù)娜罩究蚣堋τ谝粋€小型可重用組件的開發(fā)者來說,進行日志記錄只需要調用Log接口。而配置底層日志框架的負擔,就轉移到使用其組件庫的開發(fā)者身上。
參考:
??????? 7.11節(jié)詳細的說明了Commons Logging在運行時確定適當日志框架的算法。
????