2013-05-28 6 views
10

Ich habe kürzlich mit logback experimentiert und habe Beispiele direkt aus Eclipse heraus ausgeführt. Wenn ich das mache, merke ich, dass - selbst nachdem meine statische main(String[] args)-Methode (innerhalb meiner Java-Treiberklasse) beendet ist, die Anwendung weiter läuft.Stoppen des Logback-Systems für sauberes Herunterfahren

Ich habe schließlich festgestellt, dass Logback seine eigenen Threads verwaltet, die am Leben bleiben, auch nachdem meine Hauptanwendung beendet. Ich googeln für einige Lösungen um und fand dies als eine Möglichkeit explizit heruntergefahren Logback von innen Java:

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

Ist das wirklich der einzige Weg logback sauber herunterzufahren? Ich habe noch nie ein Protokollierungssystem (JUL, JCL, log4j usw.) gefunden, das Sie explizit zum Beenden Ihrer Anwendung herunterfahren lässt ...

Vielen Dank im Voraus!

aktualisieren: hier ist 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> 

Mit logback-1.0.13 und JDK 1.6u34.

+1

Wie sieht Ihre logback.xml-Datei aus? Welche Version von Logback verwenden Sie? Welches JDK? – Ceki

+0

Dank @Ceki (+1) - bitte sehen Sie meine Updates für Antworten auf alle Ihre Fragen. – IAmYourFaja

+1

Setzen Sie smtpAsynchronousSending in SMTPAppender auf false und sehen Sie, ob es einen Unterschied macht: http://logback.qos.ch/manual/appenders.html#smtpAsynchronousSending – Ceki

Antwort

7

Das Problem ist wahrscheinlich auf einen Fehler beim Logback zurückzuführen. Setzen Sie asynchronousSending auf True in SMTPAppender umgeht den Fehler (ohne es tatsächlich zu beheben). Ich habe a new issue in our jira hinzugefügt, das Problem beschreibend.

+0

Ich denke du meinst asynchrones Senden auf falsch setzen! Wie du in deinem Kommentar zum Originalbeitrag geschrieben hast. –