【问题标题】:Websphere Multiple slf4j logback bindings work aroundWebsphere 多个 slf4j logback 绑定可以解决
【发布时间】:2014-03-10 06:36:37
【问题描述】:

我正在 Websphere v8.5.5.0 上运行一个应用程序,并尝试使用 logback 作为我的日志记录框架。

当我尝试启动应用程序时,收到类似于this one 的错误:

[10/03/14 13:19:00:900 EST] 00000097 SystemErr     R   SLF4J: Class path contains multiple SLF4J bindings.
[10/03/14 13:19:00:900 EST] 00000097 SystemErr     R   SLF4J: Found binding in [bundleresource://266.fwk1755217229:1/org/slf4j/impl/StaticLoggerBinder.class]
[10/03/14 13:19:00:900 EST] 00000097 SystemErr     R   SLF4J: Found binding in    [wsjar:file:/C:/Program%20Files%20(x86)/IBM/WebSphere/AppServer_1/profiles/AppSrv01/installedApps/AUSSYDCVTLJ007Node02Cell/myapp.ear/lib/logback-classic-1.1.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
[10/03/14 13:19:00:900 EST] 00000097 SystemErr     R   SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
[10/03/14 13:19:01:313 EST] 00000097 SystemErr     R   SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

正如answer 解释的那样,ibm 库已经在类路径上包含了 logback-classic 库的实现。我想了解最新的 logback,所以想知道是否有人可以告诉我如何手动选择要使用的绑定(不使用 parent-last 类加载器!)。

【问题讨论】:

    标签: java websphere slf4j logback


    【解决方案1】:

    实际上,您在案例中看到的错误消息是 IBM WebSphere Application Server v8.5.5.0 的一个已知错误。问题是 WAS 在内部使用的是 SLF4j,但这个实现应该从应用程序中是未知的(并且不可用)。不幸的是,您看到的这些错误消息并没有被 WAS 框架阻止,但是您可以忽略它们(除非您没有很好地使用 SLF4j)。 好消息是该问题已在 FixPack 3 (WAS 8.5.5.3) 中得到修复。 该错误被引用by IBM Support here。因此,更新您的 WAS 安装。如果在应用修复后仍然出现错误消息,那么您可能需要检查您的 SLF4J 配置和使用情况。

    约翰

    【讨论】:

      【解决方案2】:

      根据 SLF4J 文档,应用程序应该选择他们想要使用的绑定并将其添加到他们的类路径中:

      Declaring project dependencies for logging

      鉴于 Maven 的传递依赖规则,对于“常规”项目(不是库或框架),声明日志依赖项可以通过单个依赖项声明来完成。

      但是,强烈建议库或框架不要声明对特定绑定的依赖:

      Libraries

      基本规则 库或框架等嵌入式组件不应声明对任何 SLF4J 绑定的依赖,而应仅依赖 slf4j-api。当库声明对特定绑定的传递依赖时,该绑定被强加给最终用户,否定 SLF4J 的目的。请注意,声明对绑定的非传递依赖(例如用于测试)不会影响最终用户。


      这里的问题更多地与日志分离有关,而不是依赖管理。 Logging Separation 的主题是 logback 手册中的discussed at length。 logback 手册中建议的“easiest approach”实际上是在您的 Web 应用程序中同时包含 SLF4J api 和 logback,并使用 parent-last 类加载:

      假设您的容器支持子类优先加载,则可以通过在每个应用程序中嵌入 slf4j 和 logback jar 文件的副本来实现日志记录的分离。对于 web-applications,将 slf4j 和 logback jar 文件放在 web-application 的 WEB-INF/lib 目录下足以赋予每个 web-application 单独的日志记录环境。

      基本上,Websphere 决定使用 SLF4J 和 logback 进行容器级日志记录。这很好,但除非应用程序想要参与容器管理的日志框架,否则不应向应用程序公开该决定。

      在 Websphere 添加选择应用程序是否应参与容器管理的日志记录的能力之前,唯一可行的解​​决方案是使用 parent-last 类加载并将 SLF4J 和您选择的绑定包含在 WEB-INF/lib 或等效目录。

      【讨论】:

      • 哪个优先于其他?
      【解决方案3】:

      阅读文档后,我已经解决了声明对正在使用的绑定的依赖关系是不好的。

      这是documentation的摘录

      库或框架等嵌入式组件不应声明对任何 SLF4J 绑定的依赖,而应仅依赖 slf4j-api。当库声明对 SLF4J 绑定的编译时依赖项时,它将该绑定强加给最终用户,从而否定了 SLF4J 的目的。当您遇到一个嵌入式组件声明对任何 SLF4J 绑定的编译时依赖项时,请花时间联系该组件/库的作者,并请他们改正他们的方式。

      这里唯一的解决方法是接受他们的 logback 版本或实现 parent-last 类加载器。前者对我来说似乎更有吸引力:P

      【讨论】:

        猜你喜欢
        • 2018-12-12
        • 2018-07-10
        • 2016-04-20
        • 2012-09-28
        • 2016-01-09
        • 2015-04-24
        • 1970-01-01
        • 2012-12-11
        • 1970-01-01
        相关资源
        最近更新 更多