Websphere多个slf4j logback绑定可以解决

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

当我尝试启动应用程序时,我遇到类似于此错误的问题:

[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,所以想知道是否有人可以告诉我如何手动选择要使用的绑定( 不使用父级最后一个类加载器! )。

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

约翰

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

声明日志记录的项目依赖项

鉴于Maven的传递依赖规则,对于“常规”项目(不是库或框架),可以使用单个依赖声明来声明日志记录依赖性。

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

图书馆

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


这里的问题与Logging Separation有关,而不是依赖关系管理。 Logging Separation的主题将在 logback手册中详细讨论 。 从logback手册中建议的“ 最简单的方法 ”是在Web应用程序中实际包含SLF4J api和logback,并使用父类最后一个类加载:

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

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

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

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

这是文档的摘录

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

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