【问题标题】:Cannot use Log4J2 with Wildfly无法将 Log4J2 与 Wildfly 一起使用
【发布时间】:2020-05-19 10:06:26
【问题描述】:

我正在开发一个使用 log4j2 进行日志记录的 JEE 应用程序。我正在尝试在 Wildfly 15 上部署它,但我无法正确记录它,说明

Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...

这就是我所做的:

  • 我已使用简单的 module.xml 将 log4j2-api.jar 作为系统模块添加到 Wildfly (system/layers/base/org/apache/log4j2/main)。
  • 我从https://github.com/jboss-logging/log4j2-jboss-logmanager 获取代码,构建了一个 JAR,并将其作为系统模块添加到 Wildfly (system/layers/base/org/jboss/log4j2/logmanager/main),带有一个 module.xml定义提供的服务:
    <provides>
        <service name="org.apache.logging.log4j.spi.Provider">
            <with-class name="org.jboss.logmanager.log4j.JBossProvider" />
        </service>
    </provides>
  • 我已将 org.apache.log4j2 和 org.jboss.log4j2.logmanager 作为依赖项添加到 org.jboss.logmanager 模块,并在后者上声明 services="export"

我知道https://issues.redhat.com/browse/WFCORE-482,但我似乎无法从中得出正确的结论。

谁能帮助或知道如何进一步诊断这里发生了什么?


为了完整参考,org.jboss.log4j2.logmanager 的 module.xml 如下所示:

<module xmlns="urn:jboss:module:1.8" name="org.jboss.log4j2.logmanager">
    <resources>
        <resource-root path="log4j2-jboss-logmanager.jar"/>
    </resources>
    <dependencies>
        <module name="org.apache.log4j2"/>
        <module name="org.jboss.logmanager"/>
    </dependencies>
    <provides>
        <service name="org.apache.logging.log4j.spi.Provider">
            <with-class name="org.jboss.logmanager.log4j.JBossProvider" />
        </service>
    </provides>
</module>

...尽管我尝试将 org.jboss.logmanager 引用为 org.jboss.log4j2.logmanager 的依赖项,反之亦然。

org.apache.log4j2 的 module.xml 如下所示:

<module xmlns="urn:jboss:module:1.1" name="org.apache.log4j2">
    <resources>
        <resource-root path="log4j-api.jar"/>
    </resources>
</module>

【问题讨论】:

  • 您的module.xml 文件是什么样的?它们应该类似于 github.com/jamezp/wildfly-core/commit/…github.com/jamezp/wildfly-core/commit/…
  • 为什么 org.jboss.log4j2.logmanager 模块依赖于 org.jboss.logmanager,而不是相反?从哪里引用 org.jboss.log4j2.logmanager 模块?这似乎是我不明白的部分。
  • 在上面添加了两个module.xml,并根据logmanager尝试了log4j2.logmanager,反之亦然,结果相同。
  • 因为org.jboss.log4j2.logmanager 需要org.jboss.logmanager 而不是相反。

标签: logging wildfly log4j2 jboss-modules


【解决方案1】:

在您的 org.jboss.log4j2.logmanager module.xml 中,您不需要 &lt;provides/&gt; 定义。除此之外,您的 module.xml 文件看起来是正确的。

接下来,您需要在部署中同时定义 org.jboss.log4j2.logmanagerorg.apache.log4j2 模块。如果您使用的是jboss-deployment-structure.xml,它看起来类似于以下 WAR:

<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="org.apache.log4j2"/>
            <module name="org.jboss.log4j2.logmanager" export="true"/>
        </dependencies>
    </deployment>
</jboss-deployment-structure>

一个小提示是那些应该直接位于modules 目录下,而不是modules/system/layers/base 目录下。虽然它不会破坏服务器提供的模块真正意味着的任何东西。

【讨论】:

  • 谢谢。只要我使用standalone.bat 从命令行启动Wildfly,它就可以正常工作。一旦我使用服务包装器(Tanuki),它就会崩溃。我没有部署结构描述符,我使用的是 EAR。无论我以哪种方式调整类路径、jboss.modules.system.pkgs、全局模块(standalone.xml)、模块定义和依赖项,我都无法让它工作。发生的情况是 MSC 服务线程从 EAR 中的 JAR 加载 EJB,并且在其上下文中它可以看到 log4j2-api,但看不到 JBossProvider。有什么想法吗?
  • 你肯定不想使用jboss.modules.system.pkgs。您最好在清单文件中使用 jboss-deployment-structure.xmlDependencies: 条目。
  • 使用 global-modules 确保您也尝试在 org.jboss.log4j2.logmanager 模块上使用 meta-inf="true"
猜你喜欢
  • 1970-01-01
  • 2014-09-25
  • 2020-03-09
  • 2015-11-28
  • 1970-01-01
  • 2021-02-18
  • 2021-07-24
  • 2016-12-25
相关资源
最近更新 更多