游乐游手机版
首页/AI教程/文章详情

Spring中日志相关对象的创建流程

时间:2026-06-06 16:44
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中日志相关对象的创建过程

**第二步:`LoggingApplicationListener` 变身“项目管家”** 这个监听器通过四个事件回调,把整个日志生命周期安排得明明白白: - **`onApplicationStartingEvent`**:容器还没准备好环境变量时,它先创建 `LoggingSystem` 并调用 `beforeInitialize()`。这个阶段日志能力最基础,只能打印一些控制台警告。 - **`onApplicationEnvironmentPreparedEvent`**:此时 `Environment` 对象已经就绪,可以读取 `application.properties` 中的日志配置了。它调用 `initialize()`,配置日志级别、日志文件路径、Pattern等。 - **`onApplicationPreparedEvent`**:容器刷新前,把之前创建好的 `LoggingSystem` 单例注册到Spring的 `BeanFactory` 中。这样后续其他Bean就能通过依赖注入获取日志系统实例。 - **`onContextClosedEvent`**:容器关闭时,调用 `cleanUp()` 释放日志系统的资源(比如关闭文件指针)。 **第三步:Logback配置文件里的 `springProperty` 标签是怎么被支持的?** 现在问题来了:我们都知道Logback原生配置文件(logback.xml)里可以用 `` 定义变量,但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
上一篇JavaWeb初识ServletContext全局对象及过滤器和监听器使用详解 下一篇Java网络编程(四) Buffer缓冲区操作与内存管理
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
企业组织级AI赋能具体实施方法
AI教程 · 2026-06-30

企业组织级AI赋能具体实施方法

前段时间收到一位读者的留言,希望聊聊企业级、组织级的AI赋能究竟该怎么落地。巧的是,前几天刚看到一份咨询调研机构的数据:对近一两年所有企业级AI赋能项目的统计显示,超过90%的甲方企业认为,AI赋能在核心业务价值链上没有发挥任何实质性作用。除了AI辅助办公、企业智能知识库这类边缘应用起到了一些辅助效

Scrapy与Redis分布式架构的日本电商多平台数据聚合系统
AI教程 · 2026-06-30

Scrapy与Redis分布式架构的日本电商多平台数据聚合系统

从事日本电商数据聚合工作时,最大的难点在于要同时应对雅虎拍卖、煤炉(Mercari)、乐天和亚马逊日本站等截然不同的平台。以往使用单机爬虫,经常出现运行中崩溃的情况——单点故障、带宽利用率不足、数据存储混乱,这三大痛点令人困扰。 本文分享一套基于Scrapy + Redis的分布式爬虫方案,专门解决

详细PuTTY 0.81安装教程 SSH远程连接与自定义路径设置
AI教程 · 2026-06-30

详细PuTTY 0.81安装教程 SSH远程连接与自定义路径设置

​ PuTTY(简称PT)是一款轻量级开源SSH Telnet客户端,凭借简洁高效的特性,多年来始终是系统管理员与开发者进行远程连接的首选利器。本教程将详细介绍PuTTY 0 81版本的完整安装过程,并指导您自定义安装路径,以便更灵活地管理SSH远程连接工具。 安装准备 首先需要说明的是,整个安装流

在线教育系统必备功能:直播课堂与题库考试架构
AI教程 · 2026-06-30

在线教育系统必备功能:直播课堂与题库考试架构

很多人一想到做在线教育系统,第一反应往往是先把直播间和课程播放器搭起来,觉得“能看课”就万事大吉了。真到落地那天才发现,系统能不能顺滑跑起来,关键全藏在那些细节里——课程怎么组织、学习进度怎么记、考试怎么处理、后台怎么管得住。前端看起来就几个页面,后端其实是一整条业务链路。不管你是要做在线教育APP

ZStack源码级AI诊断套件让故障排查秒出答案
AI教程 · 2026-06-30

ZStack源码级AI诊断套件让故障排查秒出答案

一次故障排查,到底要花多少时间? 运维人员处理私有云、虚拟化平台的问题,流程大致都是这样:先翻日志看现象,再去文档里找对应机制,然后搜社区有没有类似案例,最后综合判断给出答复。简单问题半小时,复杂问题可能要跨天——而这些时间里,大部分精力耗在了“找信息”而不是“做决策”上。 类似的问题,也许每天都在