我在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,所以想知道是否有人可以告诉我如何手动选择要使用的绑定(而不使用父级最后的类加载器!)。
答案 0 :(得分:11)
实际上,您在案例中看到的错误消息是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配置和使用情况。
约翰
答案 1 :(得分:5)
根据SLF4J文档,应用程序应该选择要使用的绑定并将其添加到类路径中:
Declaring project dependencies for logging
鉴于Maven的传递依赖规则,对于"常规"声明日志依赖关系的项目(不是库或框架)可以使用单个依赖关系声明来完成。
但是,强烈建议库或框架不声明对特定绑定的依赖:
基本规则嵌入式组件(如库或框架)不应声明对任何SLF4J绑定的依赖性,而只依赖于slf4j-api。当库声明对特定绑定的传递依赖时,该绑定强加给最终用户否定SLF4J的目的。请注意,声明对绑定的非传递依赖性(例如,用于测试)不会影响最终用户。
此处的问题与日志记录分离有关,而非与依赖项管理有关。 Logging Separation的主题是logback手册中的discussed at length。建议" easiest approach"从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和您选择的绑定。等效目录。
答案 2 :(得分:1)
阅读完文档后,我已经解决了声明对正在使用的绑定的依赖性是不好的。
的摘录诸如库或框架之类的嵌入式组件不应声明对任何SLF4J绑定的依赖性,而只依赖于slf4j-api。当库声明对SLF4J绑定的编译时依赖性时,它会对最终用户强制绑定,从而否定SLF4J的用途。当您遇到一个嵌入式组件声明对任何SLF4J绑定的编译时依赖关系时,请花时间联系所述组件/库的作者,并请他们修改他们的方法。
这里唯一的工作就是接受他们的logback版本或实现父级最后一个类加载器。前者似乎更吸引我:P