GlassFish 6+ 和 SLF4J

问题描述 投票:0回答:1

我正在努力打印由 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
。没什么。

总结

总结一下我的发现

    GlassFish 文档说使用 SLF4J 是可能的,但不推荐
  • GlassFish 开发者
  • dmatej 说“使用 war/ear 文件中需要的任何内容 - 应该有应用程序依赖项”
  • 用户
  • sysmat让它工作
  • 社区中没有人强烈抗议 SLF4J 的库不能再与 GlassFish 一起使用
  • 我发现关于该主题的其他信息很少
看来我是唯一一个将 GlassFish 与 SLF4J 一起使用的人,或者(更糟糕的是,因为令人尴尬)我是唯一一个无法让它发挥作用的人。

logging glassfish slf4j
1个回答
0
投票
将 SLF4J 与 GlassFish 6 和 7 一起使用确实存在问题。GlassFish 团队已经意识到这一点,以下是跟踪进度的问题:

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 作为内部依赖项隐藏在其中,对已部署的应用程序不可见。但还没有人尝试过或者没有报道如何成功做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.