情景:
項目部署在tomcat有日誌文件輸出,而部署在weblogic 12c上就沒有日誌文件的輸出。
分析:
可能的原因1:項目中的 slf4j 的和 weblogic 12c 自帶的slf4j模塊衝突。
解決辦法:在 WEB-INF目錄新增 weblogic.xml,配置優先加載項目中的slf4j 模塊。
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app">
<container-descriptor>
<prefer-application-packages>
<package-name>org.slf4j</package-name>
</prefer-application-packages>
</container-descriptor>
</weblogic-web-app>
可能的原因2:項目中存在多個日誌實現框架,如logback、log4j。這樣會導致一個問題,slf4j門面綁定的實現框架不確定。
小編遇到的情況是這樣的:項目預期是使用logback框架,所以配置了logback.xml文件。在tomcat運行正常,但在 weblogic環境中無法打印日誌。經查,運行過程中slf4j綁定的日誌實現並不是logback。而是其他框架。
如圖,多個found binding,說明找到多個日誌實現。而Actual binding即爲實際綁定的日誌實現。我們預期是使用 logback,但實際上綁定的是 log4j。
再往下深究,項目中並沒有顯式的引入圖中所顯示的 slf4j-log4j12 依賴。這包是從哪來的?使用maven依賴包分析工具,發現該包是由於引入 zookeeper依賴而間接引入的。
到這裏,知道jar包的來源就好辦了。
解決辦法:
方式1. 添加 log4j.xml 配置文件。既然實際綁定的是log4j,自然添加了配置就能輸出日誌。(不推薦,隨機綁定不可控)
方式2. 將 slf4j-log4j12 的依賴排除掉,僅保留logback。
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
refrence:
官網 weblogic.xml配置文件說明
源碼解讀SLF4J綁定日誌實現的原理
Weblogic 12c 運行使用Slf4j日誌框架應用解決方案