2

我希望嵌入在我的应用程序中的 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>
  • 写了我自己的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

我错过了什么吗?

4

3 回答 3

5

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

  • 您需要编写自己的 LogDelegate:
导入 org.hornetq.spi.core.logging.LogDelegate;
导入 org.slf4j.Logger;
导入 org.slf4j.LoggerFactory;
公共类 Slf4jLogDelegate 实现 LogDelegate {
    私有最终 Logger 记录器;
    公共 Slf4jLogDelegate(类 clazz){
        记录器 = LoggerFactory.getLogger(clazz);
    }
    @覆盖
    公共无效调试(对象消息){
        logger.debug(message.toString());
    }
    @覆盖
    公共无效调试(对象消息,Throwable t){
        logger.debug(message.toString(), t);
    }
    @覆盖
    公共无效错误(对象消息){
        logger.error(message.toString());
    }
    @覆盖
    公共无效错误(对象消息,Throwable t){
        logger.error(message.toString(), t);
    }
    @覆盖
    公共无效致命(对象消息){
        logger.error(message.toString());
    }
    @覆盖
    公共无效致命(对象消息,Throwable t){
        logger.error(message.toString(), t);
    }
    @覆盖
    公共无效信息(对象消息){
        logger.info(message.toString());
    }
    @覆盖
    公共无效信息(对象消息,Throwable t){
        logger.info(message.toString(), t);
    }
    @覆盖
    公共布尔 isDebugEnabled() {
        返回 logger.isDebugEnabled();
    }
    @覆盖
    公共布尔 isInfoEnabled() {
        返回 logger.isInfoEnabled();
    }
    @覆盖
    公共布尔 isTraceEnabled() {
        返回 logger.isTraceEnabled();
    }
    @覆盖
    公共无效跟踪(对象消息){
        logger.trace(message.toString());
    }
    @覆盖
    公共无效跟踪(对象消息,Throwable t){
        logger.trace(message.toString(), t);
    }
    @覆盖
    公共无效警告(对象消息){
        logger.warn(message.toString());
    }
    @覆盖
    公共无效警告(对象消息,Throwable t){
        logger.warn(message.toString(), t);
    }
}
  • 然后你需要写工厂:
导入 org.hornetq.spi.core.logging.LogDelegate;
导入 org.hornetq.spi.core.logging.LogDelegateFactory;
公共类 Slf4jLogDelegateFactory 实现 LogDelegateFactory {
    // 也许缓存代表有意义?
    @覆盖
    公共 LogDelegate createDelegate(Class clazz) {
        返回新的 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());

我只是想知道为什么他们不能使用经过验证的日志记录机制,这使得交换记录器变得容易。

于 2011-07-14T06:58:33.023 回答
3

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

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

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

于 2011-07-13T16:43:05.993 回答
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>
于 2012-10-09T08:02:56.800 回答