【问题标题】:Stopping Logback System for Clean Shutdown停止 Logback 系统以彻底关闭
【发布时间】:2013-05-23 14:47:13
【问题描述】:

我最近一直在试验logback,并且一直在 Eclipse 中直接运行示例。当我这样做时,我注意到 - 即使在我的静态 main(String[] args) 方法结束后(从我的 Java 驱动程序类内部),应用程序仍在运行。

我最终确定,Logback 正在管理自己的线程,即使在我的主应用程序退出后,这些线程仍然保持活动状态。我搜索了一些解决方案,发现这是从 Java 内部显式关闭 Logback 的一种方式:

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。

【问题讨论】:

  • 您的 logback.xml 文件是什么样的?您使用的是哪个版本的 logback?哪个JDK?
  • 感谢@Ceki (+1) - 请查看我的更新以获取所有问题的答案。
  • 将 SMTPAppender 中的 smtpAsynchronousSending 设置为 false,看看是否有区别:logback.qos.ch/manual/appenders.html#smtpAsynchronousSending
  • 就是这样@Ceki - 谢谢。如果您添加一个解释 asynchronousSending 的快速答案,我很乐意为您提供明确的答案 - 再次感谢!
  • 您是否有针对该问题的测试用例?如果有,请将其附加到jira.qos.ch/browse/LOGBACK-872 或通过电子邮件发送给我。

标签: java multithreading slf4j logback shutdown


【解决方案1】:

这个问题可能是由于 logback 中的错误。在 SMTPAppender 中将 asynchronousSending 设置为 true 可以绕过该错误(实际上并未修复它)。我已添加 a new issue in our jira 描述问题。

【讨论】:

  • 我想你的意思是,将 asynchronousSending 设置为 false!正如您在对原始帖子的评论中所写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多