首页 > 解决方案 > Log4j2 中的 JMS Appender 出错,转到 Wildfly 14

问题描述

将 Log4j2 2.11.1 与 Wildfly 14.0.1、OpenJDK 11 一起使用。我们有一个自定义 OSGi 客户端应用程序,该应用程序将日志记录到控制台附加程序和 JMS 附加程序,以将日志记录事件发送到 Wildfly 服务器。

在 Log4j2 之前,我们以编程方式将 JMS appender 粘贴到我们的 Log4j 配置中,效果很好。这真的没有必要,所以在我们最近升级到 Log4j2 时,我正在尝试使用 log4j2.xml 配置来处理所有这些并简化我们的代码。

我们有一个客户端类,它使用以下内容成功连接到我们的 Wildfly JMS 并接收消息:

  topicConnFacName: com.rsc.mmpl.TopicConnectionFactory
  initialContextFacName: org.jboss.naming.remote.client.InitialContextFactory
  URL: http-remoting://JDEVDWS166:9090
  Topic name: com.rsc.mmpl.MsgHndlrTopic

我的 log4j2.xml 配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%p %d{yyyy-MMM-dd HH:mm:ss.SSS} %c{3}[line %L] - %m%n"/>
    </Console>
    <JMS name="jmsQueue" destinationBindingName="com.rsc.mmpl.MsgHndlrTopic"
         factoryName="org.jboss.naming.remote.client.InitialContextFactory"
         factoryBindingName="com.rsc.mmpl.TopicConnectionFactory"
         ignoreExceptions="false"
         providerURL="http-remoting://JDEVDWS166:9090">
         <JsonLayout properties="true" complete="true"/>
    </JMS>
  </Appenders>
  <Loggers>
    <Root level="info">
      <AppenderRef ref="Console"/>
      <AppenderRef ref="jmsQueue"/>
    </Root>
  </Loggers>
</Configuration>

如果我注释掉我的 JMS Appender,它工作正常,所以我知道从类路径的角度来看我的 log4j 设置正确(log4j 核心和 api jar,以及 jackson jar,和 jboss-client.jar 都在整个类路径上)。

但是,当使用 JMS Appender 运行我的客户端应用程序时,我收到以下错误:

[stderr] Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.jboss.remoting3.ConfigurationEndpointSupplier$Holder
[stderr]    at org.jboss.remoting3.ConfigurationEndpointSupplier.get(ConfigurationEndpointSupplier.java:84)
[stderr]    at org.jboss.remoting3.ConfigurationEndpointSupplier.get(ConfigurationEndpointSupplier.java:40)
[stderr]    at org.wildfly.common.context.ContextManager.getPrivileged(ContextManager.java:286)
[stderr]    at org.jboss.remoting3.Endpoint.getCurrent(Endpoint.java:81)
[stderr]    at org.wildfly.naming.client.remote.RemoteNamingProviderFactory.getEndpoint(RemoteNamingProviderFactory.java:49)
[stderr]    at org.wildfly.naming.client.remote.RemoteNamingProviderFactory.supportsUriScheme(RemoteNamingProviderFactory.java:40)
[stderr]    at org.wildfly.naming.client.WildFlyRootContext.getProviderContext(WildFlyRootContext.java:784)
[stderr]    at org.wildfly.naming.client.WildFlyRootContext.lookup(WildFlyRootContext.java:140)
[stderr]    at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
[stderr]    at org.apache.logging.log4j.core.net.JndiManager.lookup(JndiManager.java:172)
[stderr]    at org.apache.logging.log4j.core.appender.mom.JmsManager.createConnection(JmsManager.java:323)
[stderr]    at org.apache.logging.log4j.core.appender.mom.JmsManager.<init>(JmsManager.java:250)
[stderr]    at org.apache.logging.log4j.core.appender.mom.JmsManager.<init>(JmsManager.java:54)
[stderr]    at org.apache.logging.log4j.core.appender.mom.JmsManager$JmsManagerFactory.createManager(JmsManager.java:130)
[stderr]    at org.apache.logging.log4j.core.appender.mom.JmsManager$JmsManagerFactory.createManager(JmsManager.java:125)
[stderr]    at org.apache.logging.log4j.core.appender.AbstractManager.getManager(AbstractManager.java:113)
[stderr]    at org.apache.logging.log4j.core.appender.mom.JmsAppender$Builder.build(JmsAppender.java:118)
[stderr]    at org.apache.logging.log4j.core.appender.mom.JmsAppender$Builder.build(JmsAppender.java:50)
[stderr]    at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:123)
[stderr]    at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:959)
[stderr]    at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:899)
[stderr]    at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:891)
[stderr]    at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:514)
[stderr]    at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:238)
[stderr]    at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:250)
[stderr]    at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:547)
[stderr]    at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:619)
[stderr]    at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:636)
[stderr]    at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:231)
[stderr]    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:243)
[stderr]    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
[stderr]    at org.apache.logging.log4j.LogManager.getContext(LogManager.java:174)
[stderr]    at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:648)
[stderr]    at com.rsc.delphi.logger.log4j.Log4jLogger.<init>(Unknown Source)
[stderr]    ... 20 more

查看 Holder 的源代码,那里的静态块似乎出了点问题,但我终生无法弄清楚是什么。

有没有办法获得更多信息来找出这里失败的原因?同样,以编程方式连接到我的 Wildfly JMS 很好,但这似乎是 Log4j2 的问题。

提前致谢。

标签: javaosgiwildflylog4j2

解决方案


看着它,我的第一个猜测是问题不在于堆栈跟踪的顶部。该类加载问题可能源于与命名接口log4j2的连接。WildFly

看起来InitialContextFactory现在提供了一个新的(子类)模块。这意味着你必须改变:

org.jboss.naming.remote.client.InitialContextFactory

至:

org.wildfly.naming.client.WildFlyInitialContextFactory

没有深入研究它,看起来ICF的处理ClassLoader问题的逻辑比ICF的要花哨一些......


推荐阅读