springboot日志不生效问题深入分析
auth by:yangs , at 2022-09-22
现象
在一次环境排查问题中,发现某系统日志不打印。通过各种排查,总结后引起原因为配置这块后面改动比较多,有配置移动,打包脚本优化涉及关联改动。导致错误配置引起日志读取失败。无法到达预期配置的效果。
深入分析
在LoggingApplicationListener进行日志系统处理。
在启动初期LoggingSystem会根据引入包判断引用哪种日志实现。按照logback,log4j,javaLog的优先级顺序,判断类是否加载决定日志具体实现。

判断是否引入对应的jar

接着进入环境配置处理。
在bootstrap处理里面可以看到,而恰好修改过后的配置logging.config放这个文件里面。


这里未启动bootstrap.enable,不会后续处理。故拿不到bootstrap里面的logging.config配置。
接着初始化后面的配置。解析application相关配置。
在配置处理完后,在LoggingApplicatoinListener会去读取日志相关配置。实现日志的各种细节。
在这个监听器里面会监听evironment准备好的事件。然后去初始化logSystem

跟进到initialIzeSystem。拿取日志配置logging.config

在AbstractLoggingSystem中,开始加载日志。可以看到,根据是否配置logging.config进行选择加载指定配置或则是程序自适应加载默认配置。

这里会进入Log4j的实现类进行后续处理。因为前面已经决定了日志实现。
没有获取logging.config的情况。进入initializeWithConvertions

尝试获取默认文件配置,可以看到程序会尝试去读取各种默认命名,以及yml,yaml,json等等格式。
默认名称包括debug如下,还会尝试读取文件名带-spring的日志配置。

因为项目中配置的日志配置文件名都是自定义的。
所以在都没有读取到默认配置后,框架最终尝试读去springboot包下的配置。


这个配置也是和我们在控制台上看到的打印格式一致。
总结
一些应用级的配置放在application里面是最佳实践。
本文深入分析了SpringBoot日志不生效的问题,主要原因是配置变动导致日志读取失败。在启动过程中,LoggingSystem根据logback、log4j、javaLog的优先级选择日志实现。当logging.config配置在bootstrap中未被处理时,将无法按预期配置日志,导致日志不打印。解决方案是确保logging.config配置正确,并在正确的位置被加载。
5310

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



