logback异步输出日志深入分析.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

bob157641554 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档