jenkins外掛開發過程中log4j包衝突問題解決過程
最近在做jenkins外掛,關於負載(job分配到節點)均衡問題,使用log4j做日誌,但是,在pom.xml中加入log4j依賴包,配置好log4j.properties,在需要輸出日誌的地方加入程式碼。以上完成以後怎麼也沒有日誌產生。因為是外掛,測試比較複雜,同時也沒錯誤資訊日誌,只能一步一步過濾可能的bug.
第一:想到log4j.properties配置檔案位置錯誤,log4j.properties需要放在classpath,即根目錄下,此外掛目錄結構不同,應該放在src/main/resources目錄下,這樣maven打包以後就在根目錄下。排除此種可能。
第二:有可能是jar包問題,發現在專案下有兩個log4j-over-slf4j-1.7.7.jar,同樣存在org.apache.log4j.Logger;當時想到可能import 這個jar包的Logger(此jar包在log4j.jar前面),首先,將此jar包刪除,如下:
最下面的scope是test,所以不用刪除,上面的是jenkins-core的依賴包,刪除這個依賴(在pom.xml中改)。
<dependency>
<groupId>org.jenkins-ci.main</groupId>
<artifactId>jenkins-core</artifactId>
<version>1.625.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
問題解決。
附:
log檔案的的位置:
Appender appender =Logger.getRootLogger().getAppender("file");
FileAppenderfileappender=(FileAppender)appender;
System.out.println(fileappender.getFile());
該類jar包的位置:
ProtectionDomain pd1 =Logger.class.getProtectionDomain();
CodeSource cs1 =pd1.getCodeSource();
cs1.getLocation().toString();