当前位置: 首页 > 知识库问答 >
问题:

Websphere多slf4j回退绑定解决了这个问题

经和洽
2023-03-14

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

当我尝试启动应用程序时,我收到了一个类似于此的错误:

[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]

正如答案所解释的,ibm库已经在类路径上包含了logback classic库的实现。我想了解最新的logback,所以想知道是否有人能告诉我如何手动选择要使用的绑定(不使用父类加载程序!)。

共有3个答案

华福
2023-03-14

在阅读了文档之后,我认为声明对正在使用的绑定的依赖是不好的。

这是文档的摘录

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

这里唯一的工作就是接受他们的logback版本或者实现一个parent-last类加载器。前者似乎更吸引我:P

芮意
2023-03-14

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

为日志记录声明项目依赖关系

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

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

图书馆

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

这里的问题更多地与日志分离有关,而不是依赖管理。日志分离的主题在日志回退手册中进行了详细讨论。日志回退手册中建议的“最简单的方法”是在您的Web应用程序中实际包含SLF4J api和logback,并使用父-最后一个类加载:

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

基本上,网络球体已经决定使用SLF4J和日志回溯进行容器级日志记录。这很好,但该决定不应向应用程序公开,除非应用程序想要参与容器管理的日志记录框架。

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

周浩淼
2023-03-14

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

约翰

 类似资料:
  • 问题内容: 这听起来像是SE网站上的一堆类似的问题,所以我应该很冗长以阐明我的问题。因此,这是项目的最小内容: 这是Maven生成的依赖树。 : 现在,让我们删除排除并再次检查依赖项。我们会得到: 因此,正如我们所看到的,一切都按预期工作,并且实际上排除了冲突的依赖关系。但事实是,即使排除 了 依赖项,在编译和调用时我仍然收到以下消息: 问题是:为什么我仍然看到此警告?为使执行过程中只有一个版本的

  • 这个问题听起来像是SE网站上的一堆类似问题,所以我应该非常详细地说明我的问题。所以,这是项目的最小: 这是maven生成的依赖树。 : 现在,让我们删除排除并再次检查依赖项。我们将得到: 因此,正如我们所看到的,一切都按预期工作,并且实际上排除了冲突的依赖关系。但问题是,即使排除了依赖关系,我仍然在编译和调用时收到以下消息: 问题是:为什么我仍然看到这个警告,以及在执行过程中应该做些什么才能使sl

  • 这可能是一个重复的问题,但我无法弄清楚绑定冲突在哪里。我有我的服务,当我运行它时,我得到了这个错误: 这是输出 显然,问题在于<code>logback</code>仍然在类路径中,但我在输出中找不到它,所以我不知道问题出在哪里。 你能发现错误吗?我将感谢你的帮助 这仅在我将服务器作为Spring Boot Application运行时发生。如果我将其作为java应用程序运行,错误就消失了....

  • 我正在尝试运行gradle从IntelliJ IDEA生成的战争。 tomcat实例运行时的输出:

  • 我正在使用JBoss6,但在尝试运行我的应用程序时遇到一个多版本错误: 错误[STDERR]SLF4J:类路径包含多个SLF4J绑定。 错误[STDERR]slf4j:在[vfs:/c:/jboss-6.0.0.final/common/lib/slf4j-jboss-logmanager.jar/org/slf4j/impl/staticloggerbinder.class]中找到绑定 错误[S

  • 环境详细信息: IBM Worklight 6.2 但这不是解决办法。请提出解决方法。