背景
今天在日常CURD的过程中,发现项目启动不了,且控制台日志未打印任何错误日志,一时间无从下手,排查难度大。本着死磕的原则,发现是配置文件中格式不正确导致的。但为什么会出现日志不打印的现象呢?
现象
启动时项目时,由于配置文件格式不正确(如使用tab缩进等),项目启动失败,而日志无打印报错,且未输出至文件中。导致排查困难。
编译器中的控制台日志
日志文件中
原因分析
因为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);
}