防止Weblogic 12c使用系统';s slf4j绑定

防止Weblogic 12c使用系统';s slf4j绑定,weblogic,slf4j,weblogic12c,Weblogic,Slf4j,Weblogic12c,我们正在使用slf4j作为日志门面构建新系统。在新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] SLF

我们正在使用slf4j作为日志门面构建新系统。在新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]

在谷歌搜索之后,我们发现这只是一个警告,slf4j将绑定第一个找到的记录器,在本例中是weblogic的系统记录器框架。有没有办法让它绑定到WAR文件中的日志框架?在weblogic.xml中使用SLF4J没有任何帮助,我不认为SLF4J提供了强制使用自己版本的方法,因为它基于类路径中的自我发现

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


否则,您可以尝试构建EAR而不是WAR,并遵循建议,尽管我怀疑如果首选web inf类在WAR中不起作用,它是否会起作用。

我们也遇到了这个问题,因为我们需要使用Log4J配置日志记录,所以这是一个问题。但是,到目前为止,使用
首选应用程序包
似乎是可行的,即将
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>

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

我们仍然有前面提到的警告,但它根据需要使用Log4J。事实上,如果您查看日志(在问题中省略),它会说:

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

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


然而,警告仍然存在,但它起了作用。修复警告会很好,但如果不更改WebLogic提供的库,则可能无法修复该警告。

对于WAR文件,您应该使用
WebLogic.xml中的
首选应用程序包,如和文章中所述

在你的情况下,会是这样的

<?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>

org.slf4j

过滤不应在类上进行,而应在资源上进行,因为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>

org.slf4j*
org.apache.commons*
org/slf4j/impl/StaticLoggerBinder.class

您的记录器将被使用,而不是系统类加载器中的记录器。

eh,我的意思是“让slf4j将记录器绑定到我提供的日志库,而不是绑定到系统库”。这与slf4j的版本无关,因为切换到1.6.1时会发生此错误,并且根据slf4j的文档,当slf4j找到多个可绑定的记录器时,它将绑定到第一个记录器,这始终是系统的slf44绑定,即org.apache.commons.*使slf4j工作所需的条目?如果是这样,为什么?晚了几天,但是:com.apache.commons.logging.*@Luca您是如何发现SLF4J将
StaticLoggerBinder.class
作为资源查找的?@PatrikMihalčin,因为SLF4J在weblogic控制台上打印“找到绑定…”消息的!