Приложение конфигурации входит в ActiveMQ с ошибкой log4j2 - PullRequest
0 голосов
/ 18 января 2020

Поэтому я пытаюсь следовать этому руководству: 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 file:

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-адрес провайдера, но без удачи.

Кто-то, может быть, есть подсказка, как правильно его настроить? Я не думаю, что это должно быть так сложно ... Я, наверное, что-то упустил ...

Спасибо!

1 Ответ

0 голосов
/ 18 января 2020

Есть несколько различий между тем, что вы настроили, и тем, что указано в приведенной вами документации. Вы создали файл jndi.properties, в котором в документации этого вообще нет, и вы используете Log4j 2.x, где в документации используется Log4j 1.2.x, поэтому практически все настройки приложения в документации бесполезны. Ваши потребности.

Вся конфигурация 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-адрес провайдера для вашего приложения.

Кроме того, вы используете https://localhost:8161 для URL-адреса провайдера в jndi.properties, но порт 8161 по умолчанию порт HTTP , который не будет работать с клиентом OpenWire JMS, который вы пытаетесь использовать. Вы почти наверняка должны использовать порт 61616 со схемой URL tcp.

Реализация ActiveMQ InitialContextFactory предназначена только на стороне клиента, то есть фактически не подключается через сеть для «поиска». ресурсы на удаленном сервере. Вместо этого все ресурсы обычно настраиваются в свойствах «среды» InitialContext. Однако существует фабрика соединений JMS по умолчанию, связанная по умолчанию с ConnectionFactory, и префикс 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>
...