如何在 Spring Boot 应用程序中引导日志系统
如果想看此文作者的原文版本请点击地址: https://todzhang.com/blogs/tech/en/boostrap_logging_in_springbootapplication
概述
好像2021年底IT业界的热点是日志系统的几个大bug,这里趁机也通过这个文章,带大家深入浅出的去了解一下在业内最常使用的日志系统Slf4 , Logback,一起研究一下它是如何在spring boot中加载并开始使用的
视频版本
如果你可能访问youtube需要看直接视频,请点击下面
https://www.youtube.com/embed/Q6GY8rLnyBc
流程图
无图无真相
下图演示了在 Spring Boot 应用程序中引导和使用 Logback 进行日志记录的过程。
关键步骤说明
SpringBoot Application区域中的逻辑第一部分
- 当一个 SpringBoot 应用程序开始执行 SpringApplicaiton.run 时,它会在内部执行
prepareEnvironment
, 这将创建或加载应用程序运行环境,例如环境变量。 - SpringBoot 使用观察者模式和 SpringApplicationEvent 来跟踪 Spring Boot 应用程序生命周期中的每个关键步骤。 SpringBoot 会将加载的环境作为参数传递给已注册的侦听器列表。
listeners.environmentPrepared(bootstrapContext, environment);
- SpringBoot 的事件发布者(EventPublishingRunListener)会发布一个名为
ApplicationEnvironmentPreparedEvent
通过它的内置多播发布者。 -
LoggingApplicationListener
是 Spring 中订阅 ApplicationEnvironmentPreparedEvent 的 6 个组件之一。它将配置 Spring 的 LoggingSystem。如果环境包含 logging.config 属性,它将用于引导日志系统,否则使用默认配置。 - SpringBoot 将利用 Classloader 尝试加载任何 LoggingSystem 或其后代。
- 如果您将 sl4j 添加到类路径中,LoggingSystemFactory 将生成一个新的 LogbackLoggingSystem,它最终扩展了 LoggingSystem。
return new LogbackLoggingSystem(classLoader);
现在我们转到 slf4j 和 logback 中的日志系统域。
- LogbackLoggingSystem 会调用 SpringBootJoranConfigurator 的 doConfig 来设置日志子系统。这个配置器是 Joran 框架的支柱。
Joran: 成熟、灵活、强大的配置框架。 logback 的配置逻辑基于哪个。详情请查看 Joran 配置框架
- Interpreter 将解析 logback.xml 中的配置细节,在内部 logback 会将上述 xml 文件的元素转换为 Event 列表,然后 Interpreter 有一个 EventPlayer 来处理这些事件。
- Interpreter是Joran的主要功能类。它扩展了 SAX DefaultHandler,它根据预定义的模式(配置为 RuleStore )调用各种操作。它利用构造函数在内存中启动一个新的 LogstashEncoder 实例。
- Joran 定义 StartEvent 和 EndEvent 来处理 XML 配置中的开始和结束元素。对于 </encoder> ,Joran 将使用反射调用 ConsolerAppender 的属性设置器,并将上述 logstashEncoder 作为属性编码器注入。
- 这是此设置的最后一步。当有日志要写入时,将调用日志 Appender 的内部编码器(在本例中为 LogstashEncoder)以呈现输出消息。
–End–