java世界里的log有多種實(shí)現,常用的有log4j和jdk1.4后自帶的java.util.logging。
好事的apache弄了個(gè)common-logging項目隔離了log4j和logging以及其它的log實(shí)現的差異。
這樣開(kāi)源項目庫里統一采用common-logging,就可以自行決定在自己的應用中采用何種實(shí)現,并跟所依賴(lài)的jar包統一起來(lái)。
據common-logging的官方文檔,決定實(shí)現方式的策略如下:
1.首先查找org.apache.commons.logging.Log屬性,該屬性可以在java代碼中設置,更常見(jiàn)的是在classpath下的common-logging.properties文件中進(jìn)行設置
2.在系統屬性中查找org.apache.commons.logging.Log
3.如果類(lèi)路徑中有log4j的jar包,則采用log4j實(shí)現
4.如果jdk版本為1.4,采用Jdk14Logger
5.采用common-logging提供的SimpleLog
以上前一步若滿(mǎn)足,則以該步驟的結果為準,后面的步驟均不執行。
用maven運行mvn test時(shí),發(fā)現我的debug信息都打不出來(lái),只能打出error信息,而且格式怪模怪樣的。
檢查了我的log4j的log4j.properties里的配置的priority為debug。
以為是maven搞鬼了,打開(kāi)eclipse,運行test,問(wèn)題照舊。
移除log4j.properties,現象一樣,表明我的log4j.properties未生效。
懷疑我的log實(shí)現不是log4j,加入監視信息,打出我的log
- Log log = LogFactory.getLog(HyperlinkHandler.class);
- System.out.println("log = " + log);
結果確實(shí)為org.apache.commons.logging.impl.Log4jLogger。
肯定是依賴(lài)的jar包中搞了鬼,祭出了屢試不爽的二分法,一一排查可疑的jar包,終于在該死的jxls-core-0.9.5.jar中發(fā)現了log4j.xml,該配置的默認priority為warn:
- <root>
- <level value="WARN"/>
- <appender-ref ref="CONSOLE"/>
- </root>
該配置優(yōu)先于我的log4j.properties,使可憐的它失去了效果。