2013-05-28 4 views
10

저는 최근에 logback을 실험 해 왔으며 Eclipse 내부에서 예제를 직접 실행했습니다. 이렇게하면 정적 인 main(String[] args) 메서드가 종료 된 후에도 (Java 드라이버 클래스 내부에서) 응용 프로그램이 계속 실행됩니다.정상 종료를위한 Logback 시스템 중지

Logback이 주요 응용 프로그램이 종료 된 후에도 계속 살아있는 자체 스레드를 관리하고 있음을 확인했습니다. 나는 몇 가지 솔루션을 주위 봤 명시 적으로 자바 내부에서 Logback을 종료하는 방법으로이 문제를 발견

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

이 정말 logback 정상적으로 종료하는 유일한 방법이 있나요? 정상적으로 응용 프로그램을 종료하기 위해 명시 적으로 종료하는 로깅 시스템 (JUL, JCL, log4j 등)을 한번도 경험하지 못했습니다 ...

미리 감사드립니다!

업데이트 : 여기에 logback.xml입니다 : logback-1.0.13 및 JDK 1.6u34를 사용

<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> 

.

+1

logback.xml 파일의 모양은 무엇입니까? 어떤 버전의 로그백을 사용하고 있습니까? 어느 JDK인가? – Ceki

+0

Thanks @Ceki (+1) - 모든 질문에 대한 답변은 내 업데이트를 참조하십시오. – IAmYourFaja

+1

SMTPAppender의 smtpAsynchronousSending을 false로 설정하고 차이점을 확인하십시오. http://logback.qos.ch/manual/appenders.html#smtpAsynchronousSending – Ceki

답변

7

문제는 아마도 logback의 버그로 인한 것일 수 있습니다. SMTPAppender에서 asynchronousSending을 true로 설정하면 실제로 버그를 수정하지 않고 버그를 피할 수 있습니다. 문제를 설명하는 a new issue in our jira을 추가했습니다.

+0

나는 asynchronousSending을 false로 설정했다고 생각합니다! 당신이 원래 게시물에 대한 귀하의 의견에 썼습니다. –