2012-03-16 85 views
11

我們正在構建使用slf4j作爲日誌外觀的新systen。當部署新的Weblogic 12C,我們發現這個錯誤的控制檯日誌:防止Weblogic 12c使用系統的slf4j綁定

SLF4J: Class path contains multiple SLF4J bindings. 
SLF4J: Found binding in [jar:file:/opt/Oracle/Middleware2/modules/org.slf4j.jdk14_1.6.1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
SLF4J: Found binding in [zip:/opt/Oracle/Middleware2/user_projects/domains/m3/servers/AdminServer/tmp/_WL_user/test/t030q4/war/WEB-INF/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class] 

谷歌搜索後,我們發現這只是一個警告,SLF4J將綁定首次發現記錄器,在這種情況下是WebLogic的系統日誌框架。有沒有什麼辦法讓它在我們的WAR文件中綁定到日誌框架?有< prefer-web-inf-classes > in weblogic.xml does not help

回答

0

我不相信SLF4J提供了強制自己版本的方法,因爲它基於類路徑中的自發現。

因此,如果您擁有WebLogic的管理權限,最簡單的解決方案是通過更新WebLogic安裝文件夾上的文件將WebLogic的SLF4J版本升級到1.6.4。

否則,你可以嘗試建立一個EAR,而不是戰爭,並按照建議here,但我懷疑,如果喜歡-WEB-INF類不以戰爭工作,將工作。

+0

呃,我的意思是「讓slf4j綁定記錄器來記錄我提供的庫,而不是綁定到系統庫」。這與slf4j的版本無關,因爲切換到1.6.1時會發生此錯誤,並且根據slf4j的文檔,當slf4j發現多個可綁定記錄器時,它將綁定到第一個記錄器,這總是系統的slf44綁定 – dhchen 2012-03-19 01:30:39

2

我們也有這個問題,因爲我們需要使用Log4J配置日誌記錄,這是一個問題。但是,使用prefer-application-packages似乎工作至今,即把一個weblogic-application.xml文件中的EAR的META-INF文件夾下面的:

<?xml version="1.0" encoding="UTF-8"?> 
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-application.xsd http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd" > 
    <prefer-application-packages> 
     <package-name>org.slf4j</package-name> 
    </prefer-application-packages> 
</weblogic-application> 

(OK指定的xmlns是舊的,但它的工作原理,你可以更新它如果你想要的話,我只是拿走了我們的,並刪除了無關的部分)。

我們仍然有上述警告,但它根據需要使用Log4J。事實上,如果你看一下在日誌the URL specified on the next line(在這個問題此處省略),它說:

通過SLF4J發出的警告僅僅是一個警告。 SLF4J仍然會綁定它在類路徑上找到的第一個框架。

所以我想它仍然使用正常類加載機制加載org.slf4j.impl.StaticLoggerBinder,我們實際配置更喜歡一個在我們的EAR(即讓它在類路徑中第一)。

然而,警告仍然存在,但它的工作原理。修正警告是很好的,但如果不更改WebLogic提供的庫,則可能無法實現。

4

對於WAR文件,您應該在weblogic.xml中使用prefer-application-packages,如thisthis中所述。

在你的情況下,它會像

<?xml version="1.0" encoding="UTF-8"?> 
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd"> 
    <wls:container-descriptor> 
     <wls:prefer-application-packages> 
      <wls:package-name>org.slf4j</wls:package-name> 
     </wls:prefer-application-packages> 
    </wls:container-descriptor> 
</wls:weblogic-web-app> 
27

過濾不應類,但在資源來完成,因爲SLF4J會查找StaticLoggerBinder.class作爲一種資源,而不是作爲一個階級。

將其包含在您的weblogic應用程序中。xml以及:

<wls:prefer-application-packages> 
    <wls:package-name>org.slf4j.*</wls:package-name> 
    <wls:package-name>org.apache.commons.*</wls:package-name> 
</wls:prefer-application-packages> 

<wls:prefer-application-resources> 
    <wls:resource-name>org/slf4j/impl/StaticLoggerBinder.class</wls:resource-name> 
</wls:prefer-application-resources> 

和您的記錄器將被用來代替System ClassLoader中的一個。

+3

是org.apache。 commons。*需要使SLF4J工作嗎?如果是這樣,爲什麼? – 2014-10-11 03:13:00

+0

遲了幾天但:com.apache.commons.logging。* – HRgiger 2016-05-26 16:36:16