清新明月CE 发表于 2021-10-3 16:28:14

从问题出发学习slf4j、logback源码系列-pattern内容解析

问题:logback.xml里面我们一样平常会配置日志的打印格式,比如%date [%thread] %-5level %X{tid} %logger{50}:%L - %msg%n,logback是如何解析和使用pattern的呢?
在logback初始化解析xml的过程中,会进入PatternLayoutBase.java的start方法
https://p5.toutiaoimg.com/large/pgc-image/07ed550a2f164d50bc591a8e05d99865
在Parser构造函数里会使用TokenStream将pattern解析为Token的集合
https://p9.toutiaoimg.com/large/pgc-image/b08ec80bb1f047e1a1d4b33d483b5e7d
然后在Parser的parse方法会把tokenList构建成Node链表
https://p5.toutiaoimg.com/large/pgc-image/8299f621364048ecbe5f299915c11a12
然后进入PatternLayoutBase.java的start方法比较关键的一步this.head = p.compile(t, getEffectiveConverterMap());
getEffectiveConverterMap()方法在PatternLayoutBase的子类PatternLayout里,将各种符号和对应的Converter放在了一个map里
https://p5.toutiaoimg.com/large/pgc-image/5b665e4b232e40c38d1a7e564961e5f8
接着是在complie方法里面把Node链表和Converter的map构建成了Converter的链表
https://p6.toutiaoimg.com/large/pgc-image/5a45a8b17b8242b39e0195f29c120b2c
https://p26.toutiaoimg.com/large/pgc-image/6266a84478864ccc89641e6272d9d193
https://p6.toutiaoimg.com/large/pgc-image/4e1307094bf74cd1b7b0833f4e71fab5
接着在postCompileProcessor.process(context, head),会把异常相关的Converter放到链表的尾节点,
https://p6.toutiaoimg.com/large/pgc-image/f659e2e0903140c8a57ba8845103ae15
到这里,根据pattern构造Converter链表就竣事了,后面拼接日志文本的内容就是根据Converter链表来举行的
https://p26.toutiaoimg.com/large/pgc-image/03ea3bc8c99b4c129aeda117887d1902
页: [1]
查看完整版本: 从问题出发学习slf4j、logback源码系列-pattern内容解析