我们正在使用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中没有帮助
答案 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
,如this和this帖子中所述。
在你的情况下,它会像
<?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中工作。