前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Log日志】在日志系统初始化之前如何打印日志

【Log日志】在日志系统初始化之前如何打印日志

作者头像
石臻臻的杂货铺[同名公众号]
发布2021-07-14 10:25:19
1.5K0
发布2021-07-14 10:25:19
举报
文章被收录于专栏:kafka专栏

之前在文章 使用Nacos简化SpringBoot配置(所有配置放入到Nacos中) 中有实现一个 EnvironmentPostProcessor的扩展接口;

但是发现日志并没有打印出来, 然后就跟着源码找了一下问题;

问题原因:

在SpringBoot加载的过程中 EnvironmentPostProcessor 的执行比较早; 这个时候日志系统根本就还没有初始化; 所以在此之前的日志操作都不会有效果;

看看日志系统加载的时机

日志系统初始化的地方 LoggingApplicationListener.onApplicationEnvironmentPreparedEvent()

知道了日志初始化的时候是在这里;那也就知道了加载时机;那么是在哪里开始加载的呢? 我们来分析一下

首先找到 spring.factories 配置文件里面的配置;

找到被加载的地方; 具体为事件ApplicationEnvironmentPreparedEvent通知到对应的监听者的;可以看到; ConfigFileApplicationListener > LoggingApplicationListener ; 前面比后面先加载

看看SpringBoo整体的加载时机 【SpringBoot】SpringBoot启动流程图和扩展点说明

从上面的图中可以了解到

ConfigFileApplicationListener执行的时候 会去 spring.factories 中加载所有 EnvironmentPostProcessor并执行postProcessEnvironment方法; 这个时候 LoggingApplicationListener还没有被执行;说明日志系统还没有被初始化; 自然而然的 在这之前的所有日志操作都是无效的;

解决方案

使用 DeferredLog 缓存日志;并在合适的时机回放日志

代码语言:javascript
复制
public class NacosEnvPostProcessor implements EnvironmentPostProcessor, ApplicationListener<ApplicationEvent>, Ordered {

    /**
     * 这个时候Log系统还没有初始化  使用DeferredLog来记录  并在onApplicationEvent进行回放
     * */
    private static final DeferredLog LOGGER = new DeferredLog();
    @Override
    public int getOrder() {
        return 0;
    }
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {  
        LOGGER.info("打印日志");
    }

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        LOGGER.replayTo(NacosEnvPostProcessor.class);
    }
}

不要忘记了在spring.factorie 配置

代码语言:javascript
复制
org.springframework.boot.env.EnvironmentPostProcessor=com.xxx.NacosEnvPostProcessor
org.springframework.context.ApplicationListener=com.xxx.NacosEnvPostProcessor

参考文章

  1. java - 如何在EnvironmentPostProcessor执行中记录错误
  2. 【SpringBoot】SpringBoot启动流程图和扩展点说明
  3. spring.factories 加载时机
  4. 使用Nacos简化SpringBoot配置(所有配置放入到Nacos中)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 看看日志系统加载的时机
  • 解决方案
  • 参考文章
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档