Как делегировать ведение журнала HornetQ на Slf4j - PullRequest
2 голосов
/ 13 июля 2011

Я хочу, чтобы вся запись в журнале из HornetQ, которая работает в моем приложении, была делегирована в slf4j. К сожалению, любая попытка не удалась. Я уже попробовал

  • добавлено jul-to-slf4j
  • установлен мост SLF4JBridgeHandler.install();
  • Попробовал Log4jLogDelegateFactory ("hornetq-configuration.xml" через <log-delegate-factory-class-name>org.hornetq.integration.logging.Log4jLogDelegateFactory</log-delegate-factory-class-name>)
  • написал свои LogDelegate и LogDelegateFactory

Но что бы я ни делал, следующие строки не улавливаются:

13.07.2011 17:42:11 org.hornetq.core.logging.impl.JULLogDelegate warn
WARNUNG: AIO wasn't located on this platform, it will fall back to using pure Java NIO. If your platform is Linux, install LibAIO to enable the AIO journal
13.07.2011 17:42:11 org.hornetq.core.logging.impl.JULLogDelegate info
INFO: Using NIO Journal
13.07.2011 17:42:11 org.hornetq.core.logging.impl.JULLogDelegate info
INFO: Started Netty Acceptor version 3.1.5.GA-r1772

Что-нибудь, что я пропустил?

Ответы [ 3 ]

5 голосов
/ 14 июля 2011

Я нашел полное решение, которым хочу поделиться с вами. Ранее я пробовал каждый из них самостоятельно, но вы должны объединить некоторые из методов, упомянутых в других ответах.

  • Вам необходимо написать собственный LogDelegate:
import org.hornetq.spi.core.logging.LogDelegate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jLogDelegate implements LogDelegate {
    private final Logger logger;
    public Slf4jLogDelegate(Class clazz) {
        logger = LoggerFactory.getLogger(clazz);
    }
    @Override
    public void debug(Object message) {
        logger.debug(message.toString());
    }
    @Override
    public void debug(Object message, Throwable t) {
        logger.debug(message.toString(), t);
    }
    @Override
    public void error(Object message) {
        logger.error(message.toString());
    }
    @Override
    public void error(Object message, Throwable t) {
        logger.error(message.toString(), t);
    }
    @Override
    public void fatal(Object message) {
        logger.error(message.toString());
    }
    @Override
    public void fatal(Object message, Throwable t) {
        logger.error(message.toString(), t);
    }
    @Override
    public void info(Object message) {
        logger.info(message.toString());
    }
    @Override
    public void info(Object message, Throwable t) {
        logger.info(message.toString(), t);
    }
    @Override
    public boolean isDebugEnabled() {
        return logger.isDebugEnabled();
    }
    @Override
    public boolean isInfoEnabled() {
        return logger.isInfoEnabled();
    }
    @Override
    public boolean isTraceEnabled() {
        return logger.isTraceEnabled();
    }
    @Override
    public void trace(Object message) {
        logger.trace(message.toString());
    }
    @Override
    public void trace(Object message, Throwable t) {
        logger.trace(message.toString(), t);
    }
    @Override
    public void warn(Object message) {
        logger.warn(message.toString());
    }
    @Override
    public void warn(Object message, Throwable t) {
        logger.warn(message.toString(), t);
    }
}
  • Тогда вам нужно написать фабрику:
import org.hornetq.spi.core.logging.LogDelegate;
import org.hornetq.spi.core.logging.LogDelegateFactory;
public class Slf4jLogDelegateFactory implements LogDelegateFactory {
    // Maybe caching of delegates makes sense?
    @Override
    public LogDelegate createDelegate(Class clazz) {
        return new Slf4jLogDelegate(clazz);
    }
}
  • Затем добавьте в файл hornetq-configuration.xml следующую строку: <log-delegate-factory-class-name>yourpackage.Slf4jLogDelegateFactory</log-delegate-factory-class-name>
  • Наконец, добавьте следующую строку перед запуском встроенного сервера: org.hornetq.core.logging.Logger.setDelegateFactory(new Slf4jLogDelegateFactory());

Мне просто интересно, почему они не могут использовать проверенные механизмы ведения журналов, которые облегчают обмен регистраторами.

3 голосов
/ 13 июля 2011

Поскольку вы используете Embedded, попробуйте добавить этот код перед запуском сервера:

org.hornetq.core.logging.Logger.setDelegateFactory (new YourOwnDelegateFactory ())

Возможно, у вас было несколько сообщений с использованием старого делегата, пока сервер не получил его из конфигурации.

0 голосов
/ 09 октября 2012

При попытке этого я также обнаружил, что когда HornetQServerImpl инициализирует свой статический журнал, он делает это перед загрузкой нового LogDelegateFactory, поэтому вместо использования того, который я указываю в hornetq-configuration.xml, который он использует JULLogDelegateFactory, поэтому его журналы напрямую выводятся на консоль.

Дайвинг по коду HornetQ Я обнаружил, что он инициализирует это на Logger.initialise() и что там он ищет свойство System с именем "org.hornetq.logger-delegate-factory-class-name", чтобы установить значение по умолчанию.фабрика, поэтому я использовал это, чтобы исправить мою проблему.

Я исправил это с помощью Spring:

<!-- This property must be set so HornetQServerImpl logger uses our factory -->
<bean id="systemPrereqs" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetClass" value="java.lang.System" />
    <property name="targetMethod" value="setProperty" />
    <property name="arguments">
        <list>
            <value>org.hornetq.logger-delegate-factory-class-name</value>
            <value>my.Slf4jLogDelegateFactory</value>
        </list>
    </property>
</bean>
...