在 Spring Boot 中定义 logback 关闭钩子
Posted
技术标签:
【中文标题】在 Spring Boot 中定义 logback 关闭钩子【英文标题】:Define logback shutdown hook in Spring Boot 【发布时间】:2018-01-23 09:20:54 【问题描述】:我在 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>
根据 logback 文档,
在应用程序关闭或重新部署时,必须停止 AsyncAppender 为了停止和回收工作线程并刷新 从队列中记录事件。
https://logback.qos.ch/manual/appenders.html
进一步说:
为了避免打断这些下的工作线程 条件下,可以将关闭钩子插入到 JVM 运行时中 在启动 JVM 关闭后正确停止 LoggerContext
我想知道如何在 Spring Boot 应用程序中停止 AsyncAppender。在 Spring Boot 的哪个地方,我应该定义关闭钩子?
【问题讨论】:
【参考方案1】:只需将<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>
有了这个,你会注意到当 Logback 自我配置时会发出以下日志消息:
ch.qos.logback.core.joran.action.ShutdownHookAction 中的信息 - 即将实例化 [ch.qos.logback.core.hook.DelayingShutdownHook] 类型的关闭挂钩
【讨论】:
【参考方案2】:我遇到了类似的问题,但 logback 版本为 1.1.6 和 spring-boot 1.5.4。 我的解决方案是添加:
logging.register-shutdown-hook=true
到application.properties文件中进行邀请
org.springframework.boot.logging.logback.LogbackLoggingSystem
在 ApplicationContext.close 调用上停止 LoggerContext。
【讨论】:
【参考方案3】:从 logback 的 1.1.10
版本开始,您无需显式定义关闭挂钩。版本1.1.10
以后,logback 负责在 web 应用程序停止或重新加载时停止当前的 logback-classic 上下文(以及所有附加程序)。尝试更新您的 logback 版本并检查一次。
这是更新后的文档:https://logback.qos.ch/manual/configuration.html#webShutdownHook
【讨论】:
以上是关于在 Spring Boot 中定义 logback 关闭钩子的主要内容,如果未能解决你的问题,请参考以下文章
spring boot logbackspring boot中logback日志乱码问题
Spring Boot:Spring Boot整合Logback和PageHelper