使用 JDK11 设置的 Wildfly 服务器中的日志记录问题

Posted

技术标签:

【中文标题】使用 JDK11 设置的 Wildfly 服务器中的日志记录问题【英文标题】:Logging issue in Wildfly server with JDK11 setup 【发布时间】:2021-08-15 20:18:10 【问题描述】:

面临与登录 Java Web 应用程序的 Wildfly 部署相关的问题。 使用的 Wildfly 版本:wildfly-15.0.0

Web 应用程序具有 Spring MVC 配置。 Spring 框架版本是 4.3.1 并且使用 logback.xmlslf4j 配置日志记录。 应用程序的JDK 合规级别为 1.8,它被设置为在 Wildfly 上的 JDK11 上运行。

应用程序日志正在 Wildfly 服务器日志中打印。它应该打印在应用程序的 logback.xml 中提供的文件中

以下是为记录添加的Jars到应用程序的 WEB-INF/lib 文件夹中。

log4j-1.2.16.jar log4j-api-2.11.2.jar log4j-to-slf4j-2.11.2.jar logback-classic-1.2.3.jar logback-core-1.2.3.jar

尝试在 $JBOSS_HOME/modules/system/layers/base/ 下的 Wildfly 服务器中添加一个模块,但没有成功。

还在 $JBOSS_HOME/standalone/configuration/standalone.xml 中的子系统“urn:jboss:domain:logging:6.0”中添加了以下配置

在此之后,应用程序日志将打印在适当的位置。但是,应用程序的自定义 jar 中的日志没有得到打印。既不在服务器日志中,也不在应用程序日志中。

相同的配置在 tomcat 9 中按预期工作。但似乎 logback.xml 没有在 Wildfly 中正确引导。 知道可能是什么问题吗?

【问题讨论】:

为什么你的 WAR 中有 logback 和 log4j 依赖? @KarlAlexander 在这种情况下没有任何区别,尝试删除 log4j 依赖项,但问题仍然存在。 【参考方案1】:

默认情况下,WildFly 有它自己的 slf4j 绑定,它会写入服务器日志管理器。如果您想使用自己的日志管理器,则需要执行以下操作之一。

jboss-deployment-structure.xml 中从您的部署中排除日志记录子系统 排除您要自己提供的日志记录依赖项,在您的情况下,它看起来像jboss-deployment-structure.xml 中的org.slf4j.apiorg.slf4j.implorg.apache.log4j 将日志记录子系统属性add-logging-api-dependencies 更改为false

更多详情请查看documentation。请注意,per-deployment logging 链接似乎已损坏,我们将对其进行修复。

【讨论】:

感谢您的及时回复。只是为了更新,前两个没有用。我已经尝试将日志记录子系统属性 add-logging-api-dependencies 添加为 false,在此更改后,应用程序自定义 jar 中的日志不会打印。例如ProjectA 在 /WEB-INF/lib 中有一个名为 'projectB.jar' 的 jar,那么 'projectB.jar' 的日志不会在任何地方打印。 您使用什么日志框架/外观?你似乎混合了 log4j、log4j2 和 slf4j。 projectB.jar 使用什么? slf4j 用作主应用程序 (projectA.war) 以及自定义 jar (projectB.jar) 中的日志框架 只要您以一种或另一种方式排除日志记录依赖项,就应该没有问题。如果它不起作用,您的部署中可能会遇到一些奇怪的 slf4j 绑定问题。如果不了解应用程序的更多信息,就很难说出问题所在。

以上是关于使用 JDK11 设置的 Wildfly 服务器中的日志记录问题的主要内容,如果未能解决你的问题,请参考以下文章

Wildfly 忽略 ApplicationPath

WildFly 8.2.0 - 失去与服务器的连接

WildFly - Files\Java\jdk1.7.0_40"" 此时出乎意料

Wildfly 14 找不到 JDK 类

如何使用 java 11 运行 Wildfly 14?

Wildfly 24 中带有 Elytron 的多个 sasl 身份验证机制