现象: 项目中写的缓存服务 , 在启动类中,注册了 关闭程序。 主要通过 slf4j接口输出到log4j2 的log 中观察程序的运行情况~ 早期的版本运行都没有发现任何问题, 但是后来观察到现象是 shutdown hook 注册的线程中的日志可能不打印,也可能打印部分,就是没有全部打印过~
第一种可能: 程序的运转有问题, shutdown执行有问题,但是我是通过 system 的TERM 信号量关闭的,通过system.out.println方式和程序的表现都能验证这个方面没有问题的~
第二种可能:程序执行 hook 没有问题,是日志的问题,后来Google了一下,确实有这个问题
https://stackoverflow.com/questions/17400136/how-to-log-within-shutdown-hooks-with-log4j2
https://segmentfault.com/a/1190000039771895
因为JVM的 shutdown hook 没有任何并发的顺序性保证措施,所以可能 log4j2的 shutdownhook 提前运行了~
解决方式就 配置文件disable 掉log4j的shutdown hook
<Configuration name="xc" status="WARN" monitorInterval="60" shutdownHook="disable">
然后再app 的hook 最后处理log4j2 的shutdown,flush掉所有后边的日志~
org.apache.logging.log4j.LogManager.shutdown();
本文分析了在使用Log4j2时遇到的ShutdownHook中日志未完全打印的问题,并提供了解决方案。通过禁用Log4j2的内置ShutdownHook并手动调用LogManager.shutdown()来确保所有日志被正确记录。
1240

被折叠的 条评论
为什么被折叠?



