Unable to register Log4j shutdown hook because JVM is shutting down. Using SimpleLogger 问题分析

最近在弄K8S集群中的pod优雅停机

 @org.springframework.context.event.EventListener(ContextClosedEvent::class)
 fun onContextClosed() {
     log.warn("onContextClosed, waiting for graceful shutdown.")

     synchronized(this) {
         // 停止接收消息 
     }
     // 等待消费中的业务完成
     
     // 清理
   
     log.warn("shutdown")
    }

依赖如下

id("org.springframework.boot") version "2.4.5"
id("io.spring.dependency-management") version "1.0.11.RELEASE"
id("com.google.protobuf") version "0.8.16"
kotlin("jvm") version "1.5.21"
kotlin("plugin.spring") version "1.5.21"
kotlin("plugin.jpa") version "1.5.21"
kotlin("plugin.allopen") version "1.5.21"
kotlin("kapt") version "1.5.21"

停机的时候总提示:Unable to register Log4j shutdown hook because JVM is shutting down. Using SimpleLogger
而另一个demo服务却正常停机打印 shutdown。

一开始怀疑是不是一个是k8s集群中 一个的本地运行呢。后来改成容器运行、k8s运行。demo服务还是正常打印。后来想到会不会是依赖版本不同?

后来一顿google。

看到log42更新记录:https://logging.apache.org/log4j/2.x/changes-report.html

怀疑跟这个有关:
Release 2.13.3 – 2020-05-10 Prevent premature garbage collection of shutdown hooks in DefaultShutdownCallbackRegistry. Fixes LOG4J2-2954. Thanks to Henry Tung.

Release 2.14.0 – 2020-11-06 这个版本就升级了

查看spring-boot-starter maven依赖

发现spring-boot-dependencies版本是2.4.X 的 spring-boot-starter-log4j2 依赖的 org.apache.logging.log4j 都是2.13.3

测试了下还真是2.5.X版本就不会出现问题!

所以 升级依赖版本可以解决 直接干到最新2.7.1 其他依赖版本需要查一下:查找升级依赖版本

 id("org.springframework.boot") version "2.7.1"
 id("io.spring.dependency-management") version "1.0.11.RELEASE"
 id("com.google.protobuf") version "0.8.16"
 kotlin("jvm") version "1.6.21"
 kotlin("plugin.spring") version "1.6.21"
 kotlin("plugin.jpa") version "1.6.21"
 kotlin("plugin.allopen") version "1.6.21"
 kotlin("kapt") version "1.6.21"

搞定!

ps:不升级依赖版本也可以。只需要在 log4j2.yaml 中加上Unable to register Log4j shutdown hook because JVM is shutting down. Using SimpleLogger 问题分析_第1张图片

你可能感兴趣的:(优雅停机,Log4j2,log4j,jvm,java)