10

私は最近logbackを試していて、Eclipse内から直接例を実行しています。main(String[] args)これを行うと、 (Java ドライバー クラス内から) 静的メソッドが終了した後でも、アプリケーションが実行され続けることに気付きます。

最終的に、Logback が、メイン アプリケーションが終了した後も存続している独自のスレッドを管理していることを確認しました。いくつかの解決策を探し回ったところ、Java 内部から Logback を明示的にシャットダウンする方法としてこれが見つかりました。

ILoggerFactory factory = LoggerFactory.getILoggerFactory();
if(factory instanceof LoggerContext) {
    LoggerContext ctx = (LoggerContext)factory;
    ctx.stop();
}

これは本当にlogbackをきれいにシャットダウンする唯一の方法ですか? アプリケーションを正常に終了するために明示的にシャットダウンするロギング システム (JUL、JCL、log4j など) に遭遇したことはありません...

前もって感謝します!

更新:ここにありますlogback.xml

<configuration debug="true" scan="true" scanPeriod="5 minutes">
    <appender name="logManager-consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>TRACE</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>NEUTRAL</onMismatch>
        </filter>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="logManager-smtpAppender" class="ch.qos.logback.classic.net.SMTPAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>NEUTRAL</onMismatch>
        </filter>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <smtpHost>my.smtp.host</smtpHost>
        <to>john.smith@example.com</to>
        <from>no-reply@example.com</from>
        <username>my_user</username>
        <password>my_password</password>
        <subject>%logger{20} - %m</subject>
        <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
        <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
            <bufferSize>5</bufferSize>
        </cyclicBufferTracker>
    </appender>

    <root level="ALL">
        <appender-ref ref="logManager-consoleAppender" />
        <appender-ref ref="logManager-smtpAppender" />
    </root>
</configuration>

logback-1.0.13 と JDK 1.6u34 を使用。

4

1 に答える 1

7

この問題は、おそらく logback のバグが原因です。SMTPAppender でasynchronousSendingを true に設定すると、バグが回避されます (実際には修正されません)。問題を説明する新しい問題をジラに追加しました。

于 2013-05-28T15:25:26.427 に答える