14

我们正在使用 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 会绑定第一个找到的 logger,在本例中是 weblogic 的系统 logger 框架。有没有办法让它绑定到我们 WAR 文件中的日志框架?在 weblogic.xml 中有 <prefer-web-inf-classes> 没有帮助

4

4 回答 4

34

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

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

于 2012-10-05T10:25:16.760 回答
4

对于 WAR 文件,您应该像本文本文prefer-application-packages中描述的那样使用。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>
于 2012-05-30T15:51:47.003 回答
3

我们也遇到了这个问题,因为我们需要使用 Log4J 配置日志记录,所以这是一个问题。但是,prefer-application-packages到目前为止,使用似乎有效,即将weblogic-application.xml文件放入META-INFEAR 的文件夹中,内容如下:

<?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。实际上,如果您查看日志中下一行指定的 URL(问题中此处省略),它会显示:

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

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

然而,警告仍然存在,但它有效。修复警告会很好,但如果不更改 WebLogic 提供的库可能是不可能的。

于 2012-05-30T14:48:23.553 回答
0

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

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

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

于 2012-03-16T16:00:17.130 回答