阻止Weblogic 12c使用系统的slf4j绑定

时间:2012-03-16 09:13:28

标签: weblogic slf4j weblogic12c

我们正在使用slf4j构建新的systen作为日志记录。在新Weblogic 12c上部署时,我们在控制台日志中发现了此错误:

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]
在google搜索之后,我们发现这只是一个警告,slf4j将绑定第一个找到的记录器,在这种情况下是weblogic的系统记录器框架。有没有办法让它绑定到我们的WAR文件中的日志框架?拥有< prefer-web-inf-classes>在weblogic.xml中没有帮助

4 个答案:

答案 0 :(得分:32)

不应对类进行过滤,而应对资源进行过滤,因为SLF4J将StaticLoggerBinder.class视为资源而不是类。

也可以在weblogic-application.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中的记录器。

答案 1 :(得分:4)

对于WAR文件,您应使用prefer-application-packages中的weblogic.xml,如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>

答案 2 :(得分:3)

我们也遇到了这个问题,因为我们需要使用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>

(好的,指定的xmlns是旧的,但它可以工作,你可以更新它,如果你想,我只是拿走了我们并删除了不相关的部分)。

我们仍然有上述警告,但它根据需要使用Log4J。事实上,如果你在日志中查看the URL specified on the next line(在问题中省略),它会说:

  

SLF4J发出的警告只是一个警告。 SLF4J仍将与在类路径中找到的第一个框架绑定

所以我猜它仍然使用普通的类加载机制来加载org.slf4j.impl.StaticLoggerBinder,我们实际配置它们更喜欢我们的EAR中的那个(即使它成为类路径中的第一个)。

然而,警告仍然存在,但它确实有效。修复警告会很好,但如果不改变WebLogic提供的库,则可能无法实现。

答案 3 :(得分:0)

我不相信SLF4J提供强制自己版本的方法,因为它基于类路径中的自我发现。

因此,如果您拥有WebLogic的管理权限,最简单的解决方案是通过更新WebLogic安装文件夹上的文件将SLF4J版本的WebLogic升级到1.6.4。

否则,您可以尝试构建EAR而不是WAR并遵循建议here,但我怀疑如果 prefer-web-inf-classes 不能在WAR中工作。