【问题标题】:How to delegate HornetQ logging to Slf4j如何将 HornetQ 日志委托给 Slf4j
【发布时间】:2011-07-13 16:22:57
【问题描述】:

我希望所有来自 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

我错过了什么?

【问题讨论】:

标签: slf4j hornetq java.util.logging


【解决方案1】:

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

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

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

【讨论】:

  • 那里有很多日志记录机制。如果我们对任何事情都很紧...总有其他人在抱怨它。我们还需要对 HornetQ 的零依赖。这意味着.. JUL.. 如果你想要一个不同的记录器.. 你可以插入它
  • 你是绝对正确的,当你的目标是零依赖时,你必须选择 JUL。作为一名开发人员,我只是想正确地记录日志,所以 slf4j 是我的解决方案,涵盖 log4j、apache commons logging、avsl、backlog 和 JUL。但是 JUL 似乎需要额外的编程工作,因为它是紧密的 java 集成并且可能导致(次要)性能缺陷(SLF4JBridgeHandler)。
【解决方案2】:

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

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

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

【讨论】:

  • 嗨,Clebert,谢谢你的回答,我也试过了(之前忘了提这个,抱歉)。问题是,无论如何,仍然有一些日志会发送到旧记录器。我找到了一个最终涵盖所有日志消息的解决方案,见下文。
【解决方案3】:

尝试这个时,我还发现HornetQServerImpl 初始化它的静态日志时,它会在加载新的LogDelegateFactory 之前这样做,所以它没有使用我在 hornetq-configuration.xml 上指定的那个,它使用@ 987654323@ 所以它的日志直接输出到控制台。

深入研究 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多