
Spring中日志相关对象的创建流程
SpringBoot启动时,LoggingApplicationListener监听容器事件并创建LoggingSystem,根据类路径自动选择日志框架(默认Logback),通过四个事件回调完成初始化、配置和清理。Logback配置文件支持springProperty和springProfile标签,由SpringBootJoranConfiguratio
好的,作为一位深耕Java生态多年的技术博主,我来帮你把这段Spring Boot日志初始化的“干货”重新梳理一遍,去掉生硬的AI腔,换上工程师之间聊天的节奏感。
先说说核心流程:Spring Boot启动时,日志系统的初始化并不是什么黑魔法,它依靠一套精心设计的事件监听机制。其中最关键的角色就是 `LoggingApplicationListener`。这个监听器会盯着容器的生命周期事件,然后在合适的时机拉起 `LoggingSystem` 对象——你可以把它理解为整个日志框架的“指挥官”。
---
那么,这个指挥官具体是怎么工作的呢?
**第一步:抽象类 `LoggingSystem` 定规矩**
`LoggingSystem` 是一个抽象类,它定义了所有日志框架(Logback、Log4J2、Java Util Logging)必须遵守的生命周期规范。你看到的这段核心代码,其实就是它的“选秀”机制:
> 通过系统属性 `logging.system` 可以强制指定日志框架,如果不指定,就按类路径中实际存在的日志库自动选择。默认情况下,因为Spring Boot starter引入了Logback,所以最终会得到 `LogbackLoggingSystem`。
这里有个有趣的逻辑:`SYSTEMS` 是一个静态Map,key是框架特有的类(比如 `ch.qos.logback.classic.Logger`),value是对应的工厂类。运行时按顺序检查哪个类在classpath上存在,就用哪个。也就是说,如果你把Logback从依赖中移除了,它会自动降级到Log4J2或者JDK自带的日志。**这才是真正的“无感适配”**。
` 定义变量,但Spring Boot允许你用 `` 来直接引用Spring Environment中的属性。这个能力从哪来?
答案藏在 `LogbackLoggingSystem` 的初始化流程里。它在加载配置时,没有用Logback原生的`JoranConfigurator`,而是用了一个增强版——`SpringBootJoranConfigurator`。这个类覆写了 `addInstanceRules` 方法,往规则引擎里追加了两组自定义标签解析器:
- `configuration/springProperty` → 交给 `SpringPropertyAction` 处理。这个Action会从Spring的 `Environment` 中读取属性值,注入到Logback上下文中。
- `*/springProfile` → 交给 `SpringProfileAction` 处理,实现按Spring Profile来选择性激活Logback配置片段(类似Maven Profile的效果)。
```ja va
class SpringBootJoranConfigurator extends JoranConfigurator {
// ...
@Override
public void addInstanceRules(RuleStore rs) {
super.addInstanceRules(rs);
Environment environment = this.initializationContext.getEnvironment();
rs.addRule(new ElementSelector("configuration/springProperty"),
new SpringPropertyAction(environment));
rs.addRule(new ElementSelector("*/springProfile"),
new SpringProfileAction(this.initializationContext.getEnvironment()));
rs.addRule(new ElementSelector("*/springProfile/*"), new NOPAction());
}
}
```
注意看最后一条规则:`*/springProfile/*` 匹配的是 `` 标签内部的子元素,用 `NOPAction` 直接忽略——因为子元素的解析工作已经由 `SpringProfileAction` 在匹配父标签时处理完毕了,不需要重复解析。
整个流程走下来,你会发现Spring Boot在日志这块做得非常干净:**抽象层(LoggingSystem)+ 事件驱动 + 自定义配置解析器**,既保持了Logback的原生能力,又无缝融入了Spring的Environment体系。没有魔法,只有设计。
来源:https://developer.aliyun.com/article/704535
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。
相关推荐
补充同频道和同主题内容,方便继续浏览更多相关内容。
同类最新
继续查看同栏目最近更新的文章。
Synthesia零基础教程:客户端安装与工作区权限设置
本文介绍了AI视频生成工具Synthesia的入门流程。内容涵盖从官网下载客户端、完成账户注册与登录,到软件安装与启动的完整步骤。详细说明了如何初始化工作区,包括创建首个AI视频项目、选择模板与AI主播。最后,指导用户理解并设置团队协作中的不同权限角色,以便安全高效地共同管理项目。
FramePack新手入门指南:安装启动报错修复导出全流程
本文详细介绍了FramePack工具从下载安装到项目导出的完整流程。内容涵盖软件安装步骤、首次启动设置、常见报错解决方案以及项目打包导出方法。指南旨在帮助用户快速掌握工具核心操作,解决使用过程中可能遇到的技术问题,确保顺利完成AI视频帧处理任务。
FLUX.1保姆级教程:环境安装、显存优化与首次出图测试
本文详细介绍了FLUX 1的安装与初步使用流程。内容涵盖从Python环境配置、代码仓库克隆、依赖包安装,到关键的显存优化设置,最后指导用户完成首次文生图测试。教程旨在帮助用户顺利搭建运行环境,解决常见安装问题,并实现基础图像生成功能。
AnythingLLM新手实战:本地大模型部署后知识库接入设置
本文介绍了在本地部署大模型后,如何为AnythingLLM设置知识库。内容涵盖知识库的基本概念、创建与配置步骤、文档上传与处理技巧,以及如何通过问答测试其效果。旨在帮助用户有效整合本地文档资源,构建个性化的AI知识助手,提升信息检索与利用效率。
Aider安装失败排查:扩展冲突与登录异常全解析
本文针对Aider安装过程中常见的扩展冲突与登录异常问题,提供了系统的排查思路与解决方案。内容涵盖如何识别并处理与其他AI工具的兼容性问题,解决因网络或账户设置导致的登录失败,以及通过环境检查、依赖更新等步骤彻底排除安装障碍,帮助用户顺利完成安装与配置。
