Springboot加载日志模块顺序
Springboot加载日志模块
Spring jcl
Spring jcl 是Springboot连接SLF4J的基础包,实现了对Log4j 2.x API是否存在,以及Spring框架类路径中的SLF4J 1.7api。
ServiceLoader
通过配置寻找接口的实现类,实现类的jar包的META-INF下新建一个文件夹services,并在services下新建一个文件,以接口的全限定名为文件名,内容为实现类的全限定名。
参考链接:
https://www.jianshu.com/p/7601ba434ff4
https://blog.csdn.net/shi2huang/article/details/80308531
Log4j获取ConfigurationFactory
核心代码
String ALL_TYPES = "*"; for (final ConfigurationFactory factory : getFactories()) { final String[] types = factory.getSupportedTypes(); if (types != null) { for (final String type : types) { // 只有 XmlConfigurationFactory 符合条件 if (type.equals(ALL_TYPES)) { final Configuration config = factory.getConfiguration(loggerContext, name, configLocation); if (config != null) { return config; } } } } }
Springboot加载log4j2的流程
Springboot 加载log4j2主要分为两个阶段,第一阶段成为start, 第二阶段为initalize
start阶段
- LogAdapter利用Class.forName加载不同日志的实现,使用内部类进行调用
- log4j 通过PluginProcess对 @Plugin注释识别ConfigurationFactory,具体可参考
Springboot配置log4j2爬坑
initalize阶段
初始化阶段,SpringApplication.run()方法的 SpringApplicationRunListeners
- beforeInitialize(), 判断是否以slf4j桥接。
if (isBridgeJulIntoSlf4j()) { removeJdkLoggingBridgeHandler(); SLF4JBridgeHandler.install(); } // ClassUtils.isPresent() Sping 实现的类似Class.forName功能 ClassUtils.isPresent(BRIDGE_HANDLER, getClassLoader());
- LoggingApplicationListener 代码配置onApplicationEvent
public void onApplicationEvent(ApplicationEvent event) { // beforeInitalize 阶段 if (event instanceof ApplicationStartingEvent) { onApplicationStartingEvent((ApplicationStartingEvent) event); } // 环境配置,即initalizeing阶段 else if (event instanceof ApplicationEnvironmentPreparedEvent) { onApplicationEnvironmentPreparedEvent( (ApplicationEnvironmentPreparedEvent) event); } // 程序运行起来后,调用日志阶段 else if (event instanceof ApplicationPreparedEvent) { onApplicationPreparedEvent((ApplicationPreparedEvent) event); } // 程序关闭 else if (event instanceof ContextClosedEvent && ((ContextClosedEvent) event) .getApplicationContext().getParent() == null) { onContextClosedEvent(); } // 失败 else if (event instanceof ApplicationFailedEvent) { onApplicationFailedEvent(); } }
- Log4j2判断日志是否为同一实例,利用了identityHashCoder给AppClassLoader做身份哈希判重
- shutdownhook 学习(有时间在研究)
private void registerShutdownHookIfNecessary(Environment environment, LoggingSystem loggingSystem) { boolean registerShutdownHook = environment .getProperty(REGISTER_SHUTDOWN_HOOK_PROPERTY, Boolean.class, false); if (registerShutdownHook) { Runnable shutdownHandler = loggingSystem.getShutdownHandler(); if (shutdownHandler != null && shutdownHookRegistered.compareAndSet(false, true)) { registerShutdownHook(new Thread(shutdownHandler)); } } } void registerShutdownHook(Thread shutdownHook) { Runtime.getRuntime().addShutdownHook(shutdownHook); }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Springboot配置log4j2爬坑
Version Springboot 2.11.1 logging.config参数 logging.config 配置在application.yml中有效,指定路径有效 log4j2 log4j2官网支持多种自动配置方式,自动扫描: 系统属性(Log4j.configuration) -> classpath中的(log4j2-test.properties)-> classpath中的(log4j2-test.yml/yaml/json/jsn/xml) -> classpath中的(log4j2.yml/yaml/json/jsn/xml) -> 默认配置 Log4j获取ConfigurationFactory // 按照测试前缀log4j2-test 和 LoggerContext上下文实例获取ConfigurationFactory Configuration config = getConfiguration(loggerContext, true, name); if (config == null) { // 按照测试前缀log4j2-test...
- 下一篇
蚂蚁区块链|开放联盟链 产品迭代发布说明(截至2020.04.28)
蚂蚁区块链|开放联盟链 产品迭代发布说明 2020-04-21 发布 区块链服务市场上线发布 支持 Go SDK,提供相应的 Demo 工程新增 燃料管理增加收支明细、链账户燃料查询功能 2020-03-31 发布 商业化版本上线,支持专业版、企业版套餐新购、续期新增 链账户管理支持密钥托管账户创建新增 燃料管理支持燃料预警新增 Cloud IDE 支持密钥托管账户调试、交易 gas 估算、gas 限额设置 2019-12-24 更新 整体改版升级新增 新增新手接入指引
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装