Apache Common-Logging是廣泛使用的Java日志門(mén)面庫。我以前一直都使用它和log4j編寫(xiě)日志。
Apache Common-Logging通過(guò)動(dòng)態(tài)查找的機制,在程序運行時(shí)自動(dòng)找出真正使用的日志庫。
Apache Common-Logging一直都運作得很好。直到最近,我寫(xiě)OSGI插件時(shí),它不能工作了。
原因是Apache Common-Logging使用了ClassLoader尋找和載入底層的日志庫。而OSGI中,不同的插件使用自己的ClassLoader。
一個(gè)線(xiàn)程的ClassLoader在執行不同的插件時(shí),其執行能力是不同的。
OSGI的這種機制保證了插件互相獨立,然而確使Apache Common-Logging無(wú)法工作!
解決之道是使用新的日志門(mén)面庫Slf4j。
Slf4j庫類(lèi)似于A(yíng)pache Common-Logging。但是,他在編譯時(shí)靜態(tài)綁定真正的Log庫。使用Slf4j時(shí),如果你需要使用某一種日志實(shí)現,那么你必須選擇正確的Slf4j的jar包的集合。
這確實(shí)麻煩了一點(diǎn),但總算可以在OSGI中開(kāi)發(fā)日志了。
其實(shí),這一點(diǎn)點(diǎn)工作也不算麻煩。
使用CommonLog接口而實(shí)際由Slf4j和Log4j實(shí)現的過(guò)程
1,項目中照常使用
12 | import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory; |
編寫(xiě)日志。
2,仍然在src下使用log4j.properties文件進(jìn)行配置。
3,使用的所有jar文件:
1)log4j-1.2.15.jar 這是log4j的庫。 Slf4j并不改變這個(gè)底層實(shí)現庫。
2)slf4j-api-1.5.2.jar 這是Slf4j庫。
3)slf4j-log4j12-1.5.2.jar 這包含Log4j的適配器和靜態(tài)綁定log4j底層實(shí)現。
4)jcl-over-slf4j-1.5.2.jar 這提供了Commons-Logging接口,以及使用common-loggin的接口,底層還是由SLF4J來(lái)決定哪種實(shí)現機制 。
這里,我們需要使用Log4j的原生庫,但是不需要Commons-Logging的原生庫。
OK,把上面這4個(gè)jar包復制到lib下,導入項目中,就可以像以往一樣繼續使用Apache Common-Logging編寫(xiě)日志了。
如果你喜歡使用slf4j的門(mén)面類(lèi),或者非log4j的日志實(shí)現庫。只需要像上面把需要的jar包扔進(jìn)自己的項目即可!
項目日志系統將會(huì )扔掉commons-logging和log4j,使用SLF4J全面接管,無(wú)障礙遷移。
優(yōu)點(diǎn):
各個(gè)jar包功能:
語(yǔ)法:
1234567891011 | import org.slf4j.Logger;import org.slf4j.LoggerFactory; public class Test { final Logger logger = LoggerFactory.getLogger(Test.class); public void hi() { // 不再需要log.isDebugalbe(),代碼更簡(jiǎn)潔 logger.debug("hello {}", "amsz"); }} |
聯(lián)系客服