Log4j2 滑铁卢 on JVM shutdown hook

本文分析了在使用Log4j2时遇到的ShutdownHook中日志未完全打印的问题,并提供了解决方案。通过禁用Log4j2的内置ShutdownHook并手动调用LogManager.shutdown()来确保所有日志被正确记录。
摘要由CSDN通过智能技术生成

现象: 项目中写的缓存服务 , 在启动类中,注册了 关闭程序。 主要通过 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();

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值