Остановка системы обратного входа для чистого отключения

Недавно я экспериментировал с logback и запускал примеры прямо из Eclipse. Когда я делаю это, я замечаю это - даже после того, как мой статический main(String[] args) метод заканчивается (изнутри моего класса драйвера Java), приложение продолжает работать.

В конце концов я убедился, что Logback управляет своими собственными потоками, которые остаются живыми даже после завершения работы моего основного приложения. Я нашел несколько решений и нашел это как способ явного отключения Logback изнутри Java:

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.

1 ответ

Решение

Проблема, вероятно, из-за ошибки в logback. Установка asynchronousSending в true в SMTPAppender обходит ошибку (без фактического ее исправления). Я добавил новую проблему в нашем jira, описывающую проблему.

Другие вопросы по тегам