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

dhc*_*hen 14 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]
Run Code Online (Sandbox Code Playgroud)

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

小智 33

不应对类进行过滤,而应对资源进行过滤,因为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>
Run Code Online (Sandbox Code Playgroud)

并且将使用您的记录器而不是System ClassLoader中的记录器.

  • 是否需要使用org.apache.commons.*条目才能使SLF4J正常工作?如果是这样,为什么? (3认同)

foc*_*och 0

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

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

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