2013-05-28 2 views
10

Недавно я экспериментировал с 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 и т. Д.), Которая заставляет вас явно закрыть ее, чтобы изящно выйти из вашего приложения ...

Заранее благодарен!

Update: здесь 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>[email protected]</to> 
     <from>[email protected]</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.xml? Какую версию журнала вы используете? Какой JDK? – Ceki

+0

Спасибо @Ceki (+1) - см. Мои обновления для ответов на все ваши вопросы. – IAmYourFaja

+1

Установите smtpAsynchronousSending в SMTPAppender в false и посмотрите, не изменилось ли это: http://logback.qos.ch/manual/appenders.html#smtpAsynchronousSending – Ceki

ответ

7

Проблема, вероятно, связана с ошибкой в ​​журнале. Установка asynchronousSending в true в SMTPAppender обходит ошибку (фактически не фиксируя ее). Я добавил a new issue in our jira, описывая проблему.

+0

Я думаю, что вы имеете в виду, установите асинхронный ответ на false! Как вы писали в своем комментарии к исходному сообщению. –

Смежные вопросы