我正在努力打印由 GlassFish 6 或 GlassFish 7 应用程序服务器中的 SLF4J 生成的任何日志消息。
我自己在我的项目中使用
org.slf4j:slf4j-api
依赖。我可能会将其更改为 JUL 或 System.Logger,但除此之外,我还使用了几个使用 SLF4J 进行日志记录的库(org.apache.httpcomponents.client5:httpclient5
、org.eclipse.jgit:org.eclipse.jgit
、org.apache.tika:tika-core
或 org.apache.activemq:activemq-client
等)。
我知道,将 SLF4J- 和 Logback-JAR 复制到认可目录已不再可能,因为自 Java 9 以来认可的功能已经消失。
但我确信一定有可能让它发挥作用。鉴于 SLF4J 在 maven 中最流行的库中排名第二,我无法想象不可能再在 GlassFish 服务器中使用任何这些库。
在GlassFish管理指南中据说
虽然应用程序组件可以使用其他日志框架,如 SLF4J 或 LOG4J2,但我们建议使用 Java Util Logging Framework,甚至更好的是它的最新外观 System.Logger。在 GlassFish 项目中的一个问题中
slf4j-api 无法与 Glassfish 6 配合使用 #24138 用户 dmatej 确认了缺少认可的问题(该问题本身是关于与 GlassFish 库捆绑的 SLF4J 版本 1 之间的依赖问题)。但他写了
在服务器级别上不可能添加另一个日志框架,但您可以在 war/ear 文件中使用您需要的任何内容 - 应该存在应用程序依赖项。我假设我需要在项目依赖项中添加 SLF4J 实现。
在提到的票证中,用户
sysmat 以 ZIP 文件形式上传了示例项目 (post)。尽管 SLF4J API 版本 2 存在实际问题,但他表示“_它可以工作,使用_”API 版本 1。
因此,当我下载该项目并尝试在新解压的 GlassFish 6.2.5 上运行它(也尝试使用 GlassFish 7.0.7)时,我在访问 v1 服务时没有收到任何日志消息。相反,我读了日志
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".|#]
SLF4J: Defaulting to no-operation (NOP) logger implementation|#]
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.|#]
我什至尝试不使用 ch.qos.logback:logback-classic
作为实现,而是使用
org.slf4j:slf4j-jdk14
并更改
logging.properties
将所有级别设置为
FINE
。没什么。总结
https://github.com/eclipse-ee4j/glassfish/issues/24138#issuecomment- 1675488136
好消息是它已经非常接近修复了。问题在于 xmlsec 依赖项中使用了旧版本的 SLF4J。此问题现已在最新版本的 xmlsec 中修复,很快 GlassFish 将升级到此新版本并修复您遇到的 SLF4J 问题。同时,有人确认从该分支编译的 GlassFish 修复了此问题:
https://github.com/dmatej/glassfish/tree/slf4j
用户 sysmat else 建议将 2 个 xmlsec 相关模块捆绑到一个模块中,并将 slf4j 作为内部依赖项隐藏在其中,对已部署的应用程序不可见。但还没有人尝试过或者没有报道如何成功做到这一点。