在Spring Boot中定义logback shutdown hook

Moa*_*zam 7 logback spring-boot

我在spring-boot(1.5.3.RELEASE)应用程序中使用AsyncAppender.

logback.xml

<appender name="FILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
    <queueSize>5000</queueSize>
    <discardingThreshold>0</discardingThreshold>
    <appender-ref ref="FILE" />
</appender>
Run Code Online (Sandbox Code Playgroud)

根据logback文档,

在应用程序关闭或重新部署时,必须停止AsyncAppender才能停止并回收工作线程并从队列中清除日志记录事件.

https://logback.qos.ch/manual/appenders.html

进一步说:

为了避免在这些条件下中断工作线程,可以在JVM运行时插入关闭挂钩,以便在启动JVM关闭后正确停止LoggerContext

我想知道如何在Spring Boot应用程序中停止AsyncAppender.在Spring Boot中的哪个位置,我应该定义shutdown hook吗?

gly*_*ing 9

只需将<shutdownHook/>指令添加到您的logback.xml.例如:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>

    <appender name="FILE_ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <queueSize>5000</queueSize>
        <discardingThreshold>0</discardingThreshold>
        <appender-ref ref="FILE" />
    </appender>

    <!-- the rest of your logback config -->

</configuration>
Run Code Online (Sandbox Code Playgroud)

有了这个,您会注意到Logback配置自身时会发出以下日志消息:

ch.qos.logback.core.joran.action.ShutdownHookAction中的INFO - 即将实例化[ch.qos.logback.core.hook.DelayingShutdownHook]类型的关闭挂钩


小智 6

1.1.10从logback版本开始,您无需显式定义 shutdown hook 。从版本1.1.10开始,当 Web 应用程序停止或重新加载时,logback 负责停止当前的 logback-classic 上下文(以及所有附加程序)。尝试更新您的 logback 版本并检查一次。

这是更新的文档:https ://logback.qos.ch/manual/configuration.html#webShutdownHook


Bal*_*rio 5

我遇到了类似的问题,但是 logback 版本 1.1.6 和 spring-boot 1.5.4 版本。我的解决方案是添加:

logging.register-shutdown-hook=true
Run Code Online (Sandbox Code Playgroud)

到 application.properties 文件进行邀请

org.springframework.boot.logging.logback.LogbackLoggingSystem在 ApplicationContext.close 调用上停止 LoggerContext。