所以我尝试遵循本教程: 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,但默认情况下使用端口 8161
是 HTTP 端口,无法与您尝试使用的 OpenWire JMS 客户端配合使用。几乎可以肯定,您应该将端口 61616
与 tcp
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/