- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
logback异步输出日志深化分析
2021-09-30
1,异步输出日志的配置
logback中的异步输出日志使用了AsyncAppender这个appender
配置方式如下:
AsyncAppender的父类是AsyncAppenderBase,用到的代码基本都在这个父类里面。
2,异步输出日志时会把信息放到BlockingQueue中
当执行()方法时,Logger里的源码是这样的:
Logger类:ch.qos.logback.classic.Logger
info方法:
filterAndLog_0_Or3Plus方法:
两头推断了一下日志级别,假如本日志级别比配置的级别低,就不打日志了。比如配置的日志级别是ERROR,但是这段代码的级别是INFO,这段日志就不打印了。最终的buildLoggingEventAndAppend方法:
在这一步封装了LoggingEvent对象,Logback后面对日志的处理基本都是以LoggingEvent对象为单位了。
最终的callAppenders方法的代码:
这个方法调用了Logger的appendLoopOnAppenders方法
appendLoopOnAppenders方法:
aai是AppenderAttachableImpl类的对象,这个类在ch.qos.logback.core.spi包下,是特地用来处理相关appender的,维护了appender的列表,并且供应appender的添加、删除等方法。Logger相关的appender就是配置文件中的ch.qos.logback.classic.AsyncAppender类,另外配置文件中的ch.qos.logback.core.rolling.RollingFileAppender不算,他属于AsyncAppender,不属于Logger。
AppenderAttachableImpl类的appendLoopOnAppenders方法:
执行了全部相关appender的doAppend方法,异步输出日志的appender是AsyncAppender
AsyncAppender的父类是AsyncAppenderBase,在ch.qos.logback.core包下
AsyncAppenderBase的父类是UnsynchronizedAppenderBase,也在ch.qos.logback.core包下,doAppend方法在这个类中:
最终的this.append方法在该类中是没有实现的笼统方法,具体实现在他的子类AsyncAppenderBase中:
然后append方法里的put方法:
日志的内容会被放到AsyncAppenderBase里定义的一个BlockingQueue中,至此L的任务完成了。
所谓的异步输出日志就是L担任往Queue中放日志,再起个线程把Queue中的日志写到磁盘上。
3,从BlockingQueue中猎取信息并写入到文件
在AsyncAppender的父类AsyncAppenderBase里面定义了一个叫Worker的内部类,这个类担任从BlockingQueue中取出信息并处理,Worker的定义如下:
另外AsyncAppenderBase还定义了Worker线程的start和stop方法,是重写的父类UnsynchronizedAppenderBase中的方法:
可以看到,在while循环期间,Worker从blockingQueue里面拿出一个元素并进行处理,还是调用了AppenderAttachableImpl的appendLoopOnAppenders方法(和上面一样):
调用了全部Appender的doAppend方法,在上面的配置中,AsyncAppenderBase相关的appender是RollingFileAppender,在ch.qos.logback.core.rolling包中
RollingFileAppender的父类是FileAppender,在ch.qos.logback.core包中
FileAppender的父类是OutputStreamAppender,也在ch.qos.logback.core包中
OutputStreamAppender的父类是UnsynchronizedAppenderBase,doAppend方法在这个类中(还是和上面的一样):
这段代码,经过了一堆的推断和设置,调用了append方法,本人类里的append方法是个笼统方法,具体的实现写在了他的子类OutputStreamAppender里,代码如下:
然后是subAppend方法:
然后是writeOut方法:
调用了encoder的doEnc
文档评论(0)