2013-05-28 7 views
10

Ho sperimentato recentemente con logback e ho eseguito esempi direttamente da Eclipse. Quando faccio questo, noto che, anche dopo che il mio metodo statico main(String[] args) termina (dall'interno della mia classe di driver Java), l'applicazione continua a funzionare.Arresto del sistema di logback per l'arresto pulito

Alla fine ho appurato che Logback sta gestendo i propri thread che rimangono in vita anche dopo la chiusura dell'applicazione principale. Ho cercato su google in giro per alcune soluzioni e ho trovato questo come un modo di spegnere esplicitamente Logback dall'interno Java:

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

è davvero questo l'unico modo di spegnere logback modo pulito? Non ho mai incontrato un sistema di registrazione (JUL, JCL, log4j, ecc.) Che ti fa spegnere esplicitamente per uscire con grazia dall'applicazione ...

Grazie in anticipo!

Aggiornamento: qui è 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> 

Utilizzando logback-1.0.13 e JDK 1.6u34.

+1

Che aspetto ha il file logback.xml? Quale versione di logback stai usando? Quale JDK? – Ceki

+0

Grazie a @Ceki (+1) - si prega di consultare i miei aggiornamenti per le risposte a tutte le vostre domande. – IAmYourFaja

+1

Imposta smtpAsynchronousSending in SMTPAppender su false e controlla se fa la differenza: http://logback.qos.ch/manual/appenders.html#smtpAsynchronousSending – Ceki

risposta

7

Il problema è probabilmente dovuto a un bug nel logback. L'impostazione di asynchronousSending su true in SMTPAppender elude il bug (senza risolverlo effettivamente). Ho aggiunto a new issue in our jira descrivendo il problema.

+0

Penso che tu intenda, imposta asincronoInvio su falso! Come hai scritto nel tuo commento sul post originale. –

Problemi correlati