01.sofa-common-tools
2020-02-20 10:12:50 0 举报
SOFA 源码解析
作者其他创作
大纲/内容
Y
end
log4j判断
①:Spring 容器启动,会发布 ApplicationEnvironmentPreparedEvent 事件(Spring 加载配置文件事件),然后会被 CommonLoggingApplicationListener 类监听到②:如果配置文件中有这样一个 key:key 以 sofa.middleware.log. 开头且 key 不等于 sofa.middleware.log.console 且 key 以 .console 结尾,就先初始化 log,然后 reInitialize③:CommonLoggingApplicationListener 这个类会去监听 spring 事件,然后会调用 reInitializeLog 方法初始化 log 组件,为啥要加上 re 呢?因为后面会对日志组件重新初始化④:在这里会首先初始化一个 SpaceInfo,也即每个 SpaceId 对应一个 SpaceInfo ,SpaceInfo 里有啥呢,有一个 AbstractLoggerSpaceFactory,它有多个实现(包含log4j2、logback 等),看到这里应该就明白了为啥要求每个中间件组件都有一个唯一的 spaceId 的原因了,日志隔离就是靠这个 SpaceId 来实现的⑤:从名字上看就知道这是一个多种日志与空间对应管理的类,在这里会调用 createILoggerFactory 方法,顾名思义就是创建 ILoggerFactory⑥:logback 判断:判断规则是用当前 classloader 能够加载到 ch.qos.logback.classic.LoggerContext 此类,如果可以加载到,再判断配置文件中是否禁用了 logback⑦:log4j2 判断:判断规则是用当前 classloader 能够加载到 org.apache.logging.slf4j.Log4jLoggerFactory 此类,如果可以加载到,再判断配置文件中是否禁用了 log4j2,后面的判断大同小异,请读者自行分析⑧:这里加载的规则是读取 spaceName+/log/log4j2/log-conf.xml,也即我们在项目实战中定义的特殊位置的配置文件⑨:初始化 loggerContext,注意它是 log4j2 中的对象,再接下来即是拿到 xml 中的配置,然后去初始化 log 组件,在此不做分析,有兴趣的同学可参考 log4j2 官网研究一下。值得一提的是,在这里 SOFA 团队也提供了扩展机制 Log4j2FilterGenerator,是通过 spi 来做扩展的,通过它可以添加自定义的 filter⑩:在这里会去判断 logger 是否已经存在,不存在的会调用 newLogger 方法创建,在这个方法里,实际上就是用之前创建的 loggerContext 对象去创建 logger,至此拿到 log 实例
NOP_LOGGER_FACTORY
⑧ doBuild初始化 log4j2 中的 loggerContext
也就是说,如果 Spring 没有初始化 log 组件,那么 log 就会懒加载,即首次调用 API 的时候去加载所以这个方法无论如何都会进入
⑨ Log4j2LoggerSpaceFactory.span style=\
build这里会调用 build 方法构造 Log4j2LoggerSpaceFactory 对象
请读者span style=\
Spring 启动
⑤ MultiAppLoggerSpaceManager.createILoggerFactory
Log4j2LoggerSpaceFactory.span style=\
⑩ DefaultLog4j2ReInitializer.reInitialize根据配置文件中的属性,判断是否需要添加一个span style=\
中间件使用日志的 API 入口即示例中的 ApmLoggerFactory
④ MultiAppLoggerSpaceManagergetLoggerBySpace
specifySpaceLogConfigProperties给 spaceInfo 设置默认属性
Log4j2LoggerSpaceFactory.reInitialize这里主要是通过 spi 扩展查找 Log4j2ReInitializer 实现类,然后传入 log 相关的配置,重新初始化
② CommonLoggingApplicationListener.reInitializeLog
logback 判断
log-sofa-boot-starter 整合后的功能
N
JCL判断
tips:这里会把 logger 的 additive 设置为 false,这也是为什么在配置文件中加了配置后,日志不打印到文件中的原因
①
③ 是否需要初始化 log
⑦ getSpaceLogConfigFileURL加载 log4j2 的配置文件
⑥ log4j2判断
0 条评论
下一页