Logback
通过static block加载,位置:StaticLoggerBinder
static {
SINGLETON.init();
}
- ContextInitializer加载配置
获取配置文件顺序:环境变量(logback.configurationFile)=>classpath: logback-test.xml=>classpath:logback.groovy=>classpath:logback.xml。
默认配置(BasicConfigurator)配置了ConsoleAppender用来将日志输出到控制台。 - 构建ContextSelector。
没有配置环境变量logback.ContextSelector的情况下,会构建DefaultContextSelector。
getLogger分析
private static final Logger log = LoggerFactory.getLogger(A.class);
根据Slf4J部分对getLogger的解析,以上getLogger函数的调用最终会调用DefaultContextSelector.getLoggerContext().getLogger(String name)。读代码可知创建Logger的逻辑在createChildByName(root级别的Logger在Logback初始化时已创建)。
log.info/log.debug等方法的分析
Slf4J
SLF4J中首次getLogger时会初始化(LoggerFactory.getILoggerFactory中会调用初始化方法performInitialization),其中bind()函数会通过ClassLoader查找类“org/slf4j/impl/StaticLoggerBinder.class”,
通过直接调用就会加载StaticLoggerBinder的static块,从而初始化具体日志框架。同步初始化完成后,会调用具体日志框架的StaticLoggerBinder的getLoggerFactory方法,返回的ILoggerFactory接口的实例则为具体Logger的工厂。
Spring Boot 中的logback
相关类:
LoggingSystemFactory:LoggingSystem类中的静态变量,通过LoggingSystemFactory#fromSpringFactories调用初始化赋值,实际实例DelegatingLoggingSystemFactory。
应用启动时
- 获取当前使用的日志系统。
若有环境变量(org.springframework.boot.logging.LoggingSystem)则按照其指定的类名实例化。
若无,则通过工厂(LoggingSystemFactory)实例化,即先通过SpringFactoriesLoader#loadFactories加载多个工厂,获取第一个能获取的实例(根据spring-boot包中的spring.factories文件定义,第一个工厂类为logback实现,所以spring boot默认使用logback)。 - 调用日志系统的beforeInitialize函数做预初始化。
应用环境就绪时
初始化
- 设置具体日志系统的环境变量。
- initializeSystem函数
- 具体日志系统对象initialize函数(如LogbackLoggingSystem.initialize)。
- AbstractLoggingSystem.initialize函数
- AbstractLoggingSystem.initializeWithConventions函数。
a. 加载具体日志系统的配置文件
b. 若无,加载Spring定制的配置文件(标准文件名加“-spring”)。