【异常优化】springBoot项目启动失败,Log4j日志无法打印?

488 阅读1分钟

背景

今天在日常CURD的过程中,发现项目启动不了,且控制台日志未打印任何错误日志,一时间无从下手,排查难度大。本着死磕的原则,发现是配置文件中格式不正确导致的。但为什么会出现日志不打印的现象呢?

现象

启动时项目时,由于配置文件格式不正确(如使用tab缩进等),项目启动失败,而日志无打印报错,且未输出至文件中。导致排查困难。

编译器中的控制台日志

image.png

日志文件中

image.png

原因分析

因为log4j是异步线程打印的,System.exit()关闭时,日志可能还没打,整个虚拟机都被关掉,log4j无法完成日志的打印。

解决方案

在system.exit调用前,使用sleep(100),先睡100ms,等日志打印完成后,在退出。由于此时也要执行System.exit(),故睡一小会,也不影响。

参考代码

        try{
            SpringApplication.run(UserManagerApplication.class, args);
        }catch (Exception e){
            logger.error("Start user manager error", e);
            sleep(100);
            System.exit(-1);
        }

参考资料

参考链接1

参考链接2