java - 配置应用程序登录 ActiveMQ,但 log4j2 失败

标签 java xml jms activemq log4j2

所以我尝试遵循本教程: https://activemq.apache.org/how-do-i-use-log4j-jms-appender-with-activemq 将我的应用程序日志记录到我在 ActiveMQ 中创建的队列中。

目标非常简单,我只想配置我的记录器以使用 JMS 附加程序直接记录到队列。

这是我用于测试的主类:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Main {


    public static void main(String[] args) {

        final Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
        logger.error("Test.");

    }
}

log4j.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="Main">
  <Appenders>
    <JMS name="jmsQueue" destinationBindingName="MyQueue"
        factoryName="org.apache.activemq.jndi.ActiveMQInitialContextFactory"
        factoryBindingName="ConnectionFactory"> 
      <JsonLayout properties="true"/>
    </JMS>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="jmsQueue"/>
    </Root>
  </Loggers>
</Configuration>

jndi.properties 文件:

queue.MyQueue=MyQueue

java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory

# use the following property to configure the default connector
java.naming.provider.url = https://localhost:8161

# use the following property to specify the JNDI name the connection factory
# should appear as. 
#connectionFactoryNames = connectionFactory, queueConnectionFactory, topicConnectionFactry

# register some queues in JNDI using the form
# queue.[jndiName] = [physicalName]
queue.MyQueue = MyQueue


# use the following property to specify the JNDI name the connection factory
# should appear as.
connectionFactoryNames = connectionFactory

在尝试运行我得到的代码时:

2020-01-18 17:31:44,592 main WARN The JNDI InitialContextFactory class name [org.apache.activemq.jndi.ActiveMQInitialContextFactory] was provided, but there was no associated provider URL. This is likely to cause problems.
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.
2020-01-18 17:31:49,638 main ERROR An exception occurred processing Appender jmsQueue org.apache.logging.log4j.core.appender.AppenderLoggingException: Error sending to JMS Manager 'jmsQueue': JMS message producer not available
    at org.apache.logging.log4j.core.appender.mom.JmsManager.send(JmsManager.java:455)
    at org.apache.logging.log4j.core.appender.mom.JmsAppender.append(JmsAppender.java:251)
    at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
    at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
    at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:543)
    at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:502)
    at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:485)
    at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:460)
    at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
    at org.apache.logging.log4j.core.Logger.log(Logger.java:161)
    at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2198)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2152)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2135)
    at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2011)
    at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1983)
    at org.apache.logging.log4j.spi.AbstractLogger.error(AbstractLogger.java:740)
    at com.noamg.Main.main(Main.java:12)

我试图为 jndi 提供一个关联的提供商 URL,但没有成功。

有人可能知道如何正确配置它?我不认为这应该那么难...我可能错过了一些东西...

谢谢!

最佳答案

您的配置与您引用的文档概述之间存在一些差异。您创建了一个 jndi.properties 文件,其中文档根本没有列出该文件,并且您使用的是 Log4j 2.x,而文档使用的是 Log4j 1.2.x,所以基本上所有附加程序文档中的配置对于您的需求来说毫无值(value)。

所有 JNDI 配置都可以通过附加程序本身进行,因此不需要 jndi.properties 文件。

WARN 消息表示您的附加程序配置存在问题:

WARN The JNDI InitialContextFactory class name [org.apache.activemq.jndi.ActiveMQInitialContextFactory] was provided, but there was no associated provider URL. This is likely to cause problems.

因此,您需要在您的附加程序上配置提供程序 URL。

此外,您在 jndi.properties 中使用 https://localhost:8161 作为提供程序 URL,但默认情况下使用端口 8161HTTP 端口,无法与您尝试使用的 OpenWire JMS 客户端配合使用。几乎可以肯定,您应该将端口 61616tcp URL 方案一起使用。

ActiveMQ InitialContextFactory 实现只是客户端,这意味着它实际上并不通过网络连接来“查找”远程服务器上的资源。相反,所有资源通常都在 InitialContext 的“环境”属性中配置。但是,默认情况下有一个默认绑定(bind)到 ConnectionFactory 的默认 JMS 连接工厂,并且如果您不想或不能,则可以在任何队列名称上使用 dynamicQueues/ 前缀。无需专门配置它。

因此,我建议您删除 jndi.properties 文件并使用此附加程序配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="Main">
  <Appenders>
    <JMS name="jmsQueue" destinationBindingName="dynamicQueues/MyQueue"
        factoryName="org.apache.activemq.jndi.ActiveMQInitialContextFactory"
        factoryBindingName="ConnectionFactory" providerURL="tcp://localhost:61616"> 
      <JsonLayout properties="true"/>
    </JMS>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="jmsQueue"/>
    </Root>
  </Loggers>
</Configuration>

关于java - 配置应用程序登录 ActiveMQ,但 log4j2 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59802053/

相关文章:

java - JMS CreateQueue 问题

java - 不知道如何在java中返回一个类

java - 通过 XPath 将任意 XML 字符串插入 XML 文档的代码

java - WebSphere MQ JMS 连接发生错误

python - 使用 python 获取 youtube 数据

java - 转换 XML 以声明根元素上的所有命名空间

mysql - 如何解码并查看Jboss JMS消息内容?

java - 如何在 Vaadin ComboBox 中添加搜索图标?

java - 选择设计模式

java - eclipse中如何自动导出项目?