如何将HornetQ日志记录委派给Slf4j

时间:2011-07-13 16:22:58

标签: slf4j hornetq java.util.logging

我希望从我的应用程序中嵌入的HornetQ的所有日志记录委托给slf4j。不幸的是,任何尝我已经尝试过了

  • 添加了jul-to-slf4j
  • 安装了网桥SLF4JBridgeHandler.install();
  • 通过Log4jLogDelegateFactory尝试了<log-delegate-factory-class-name>org.hornetq.integration.logging.Log4jLogDelegateFactory</log-delegate-factory-class-name>(“hornetq-configuration.xml”)
  • 写了我自己的LogDelegateLogDelegateFactory

但无论我做什么,下面的行都没有抓住:

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 个答案:

答案 0 :(得分:5)

我找到了一个完整的解决方案,我想与您分享。 我之前已经尝试过各自的这些,但你必须结合其他答案中提到的一些技术。

  • 您需要编写自己的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());

我只是想知道为什么他们不能使用经过验证的记录机制,这样可以轻松交换记录器。

答案 1 :(得分:3)

由于您运行的是Embedded,请在启动服务器之前尝试添加此代码:

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

在服务器从配置中获取之前,您可能有一些使用旧委托的消息。

答案 2 :(得分:0)

尝试此操作时,我还发现当HornetQServerImpl初始化其静态日志时,它会在加载新LogDelegateFactory之前执行此操作,而不是使用我在hornetq-configuration上指定的那个。 xml它使用JULLogDelegateFactory,因此它的日志直接输出到控制台。

在HornetQ的代码上潜水我发现它在Logger.initialise()初始化它,并且它还在那里寻找一个名为"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>