4

Logback で JMSAppenders を使用しようとしています。それを行うための簡単なアプリを試してみたところ、ログが ActiveMQ のキューに正常に送信されました。

package test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggerTest {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger("test");
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error", new Exception(""));


    }
}

すべて正常に実行されますが、メインのすべてのステートメントが実行された後でも、このアプリケーションは終了しません。

いくつか突っついた後、メインスレッドが終了した後、ActiveMQ Transport と DestroyJavaVM の 2 つの非デーモンスレッドがアクティブになっていることに気付きました。この DestoryJavaVM スレッドは、メインスレッドが終了した後に発生したと思います。

これは、セッション/接続が閉じないことに関係していると思います。ブローカーを終了すると、アプリも終了します。

stop()JMSQueueAppender にはセッションを閉じるメソッドがありますが、stop呼び出されていないようです。他のアペンダーに対してもメソッドが呼び出されていないようです - RollingFileAppender で試しました。

HornetQ で同じセットアップを試しましたが、正常に動作しますが、activeMQ では動作しません

私はslf4j 1.6.4、logback 1.0.0、およびactivemq 5.5.0を使用しています

ログバックの設定はこちら

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are by default assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        </pattern>
    </encoder>
</appender>


<appender name="Queue" class="ch.qos.logback.classic.net.JMSQueueAppender">
    <InitialContextFactoryName>
        org.apache.activemq.jndi.ActiveMQInitialContextFactory
    </InitialContextFactoryName>
    <ProviderURL>tcp://localhost:61616</ProviderURL>
    <QueueConnectionFactoryBindingName>
        ConnectionFactory
    </QueueConnectionFactoryBindingName>
    <QueueBindingName>dynamicQueues/MyQueue</QueueBindingName>
</appender>


<root level="debug">
    <appender-ref ref="Queue" />
    <appender-ref ref="STDOUT" />
</root>

<logger name="org.apache.activemq" additivity="false" level="DEBUG">
    <appender-ref ref="STDOUT" />
</logger>

</configuration>

とポン

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>LoggerTest</groupId>
    <artifactId>LoggerTest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.0</version>
<!--            <scope>runtime</scope> -->
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.0.0</version>
<!--            <scope>runtime</scope> -->
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-core</artifactId>
            <version>5.5.0</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>

このセットアップの何が問題なのか、誰でも指摘できますか。前もって感謝します

4

2 に答える 2

1

ActiveMQ トランスポートは、明示的にシャットダウンされるまで存続しますが、LogBack は明らかに自動的にはシャットダウンしません。

次の方法でシャットダウンをトリガーできます。

ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory();
// Check for logback implementation of slf4j
if (loggerFactory instanceof LoggerContext) {
    LoggerContext context = (LoggerContext) loggerFactory;
    context.stop();
}

ここから取得:ログバックを使用してシャットダウンするときにイベントをフラッシュする必要がありますか?

ActiveMQ 5.7.0、LogBack 1.1.2 で検証済み

于 2014-05-07T21:18:13.190 に答える