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>)を試しました
  • 自分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

私が逃したものはありますか?

4

3 に答える 3

5

あなたと共有したい完全な解決策を見つけました。私は以前にこれらをそれぞれ単独で試しましたが、他の回答で言及されているテクニックのいくつかを組み合わせる必要があります。

  • 独自の LogDelegate を作成する必要があります。
org.hornetq.spi.core.logging.LogDelegate をインポートします。
org.slf4j.Logger をインポートします。
org.slf4j.LoggerFactory をインポートします。
public class Slf4jLogDelegate は LogDelegate を実装します {
    プライベート最終ロガー ロガー;
    public Slf4jLogDelegate(Class clazz) {
        ロガー = LoggerFactory.getLogger(clazz);
    }
    @オーバーライド
    public void debug(オブジェクトメッセージ) {
        logger.debug(message.toString());
    }
    @オーバーライド
    public void debug(Object メッセージ、Throwable t) {
        logger.debug(message.toString(), t);
    }
    @オーバーライド
    public void error(オブジェクトメッセージ) {
        logger.error(message.toString());
    }
    @オーバーライド
    public void error(Object メッセージ、Throwable t) {
        logger.error(message.toString(), t);
    }
    @オーバーライド
    public void fatal(オブジェクトメッセージ) {
        logger.error(message.toString());
    }
    @オーバーライド
    public void fatal(Object メッセージ、Throwable t) {
        logger.error(message.toString(), t);
    }
    @オーバーライド
    public void info(オブジェクトメッセージ) {
        logger.info(message.toString());
    }
    @オーバーライド
    public void info(Object メッセージ、Throwable t) {
        logger.info(message.toString(), t);
    }
    @オーバーライド
    public boolean isDebugEnabled() {
        logger.isDebugEnabled(); を返します。
    }
    @オーバーライド
    public boolean isInfoEnabled() {
        logger.isInfoEnabled(); を返します。
    }
    @オーバーライド
    public boolean isTraceEnabled() {
        logger.isTraceEnabled(); を返します。
    }
    @オーバーライド
    public void trace(オブジェクトメッセージ) {
        logger.trace(message.toString());
    }
    @オーバーライド
    public void trace(Object メッセージ、Throwable t) {
        logger.trace(message.toString(), t);
    }
    @オーバーライド
    public void warn(オブジェクトメッセージ) {
        logger.warn(message.toString());
    }
    @オーバーライド
    public void warn(Object メッセージ、Throwable t) {
        logger.warn(message.toString(), t);
    }
}
  • 次に、ファクトリを記述する必要があります。
org.hornetq.spi.core.logging.LogDelegate をインポートします。
org.hornetq.spi.core.logging.LogDelegateFactory をインポートします。
public class Slf4jLogDelegateFactory は LogDelegateFactory を実装します {
    // デリゲートのキャッシュは理にかなっているのでしょうか?
    @オーバーライド
    public 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 に答える