【问题标题】:Prevent Weblogic 12c from using system's slf4j binding防止 Weblogic 12c 使用系统的 slf4j 绑定
【发布时间】:2012-03-16 09:13:27
【问题描述】:

我们正在使用 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 中有 没有帮助

【问题讨论】:

    标签: weblogic slf4j weblogic12c


    【解决方案1】:

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

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

    【讨论】:

    • 使 SLF4J 工作需要 org.apache.commons.* 条目吗?如果有,为什么?
    • 晚了几天但是:com.apache.commons.logging.*
    • @Luca 你是如何发现 SLF4J 寻找 StaticLoggerBinder.class 作为资源的?
    • @PatrikMihalčin 因为 slf4j 在 weblogic 控制台上打印“找到绑定...”消息!
    【解决方案2】:

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

    【讨论】:

      【解决方案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 提供的库,可能是不可能的。

      【讨论】:

        【解决方案4】:

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

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

        否则,您可以尝试构建 EAR 而不是 WAR,并遵循建议 here,尽管我怀疑如果 prefer-web-inf-classes 不起作用一场战争。

        【讨论】:

        • 嗯,我的意思是“让 slf4j 将记录器绑定到我提供的日志库,而不是绑定到系统库”。这和slf4j的版本无关,因为切换到1.6.1出现这个错误,根据slf4j的文档,当slf4j发现多个可绑定logger时,会绑定到第一个logger,始终是系统的slf44绑定
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-06
        相关资源
        最近更新 更多