Log4j中的AsyncAppender的實現原理


log4j里有個Appender:AsyncAppender,這個Appender是用於解決在某一時間里大量的日志信息進入Appender如何去處理的問題。AsyncAppender采用的方案是這樣的,以下是AsyncAppender的工作原理圖: 

 

AsyncAppender采用的是生產者消費者的模型進行異步地將Logging Event送到對應的Appender中。 
(1)生產者:外部應用了Log4j的系統的實時線程,實時將Logging Event傳送進AsyncAppender里 
(2)中轉:Buffer和DiscardSummary 
(3)消費者:Dispatcher線程和appenders 
  
工作原理: 
1)  Logging Event進入AsyncAppender,AsyncAppender會調用append方法,在append方法中會去把logging Event填入Buffer中,當消費能力不如生產能力時,AsyncAppender會把超出Buffer容量的Logging Event放到DiscardSummary中,作為消費速度一旦跟不上生成速度,中轉buffer的溢出處理的一種方案。 
2)  AsyncAppender有個線程類Dispatcher,它是一個簡單的線程類,實現了Runnable接口。它是AsyncAppender的后台線程。 
Dispatcher所要做的工作是: 
①  鎖定Buffer,讓其他要對Buffer進行操作的線程阻塞。 
②  看Buffer的容量是否滿了,如果滿了就將Buffer中的Logging Event全部取出,並清空Buffer和DiscardSummary;如果沒滿則等待Buffer填滿Logging Event,然后notify Disaptcher線程。 
③  將取出的所有Logging Event交給對應appender進行后面的日志信息推送。 
以上是AsyncAppender類的兩個關鍵點:append方法和Dispatcher類,通過這兩個關鍵點實現了異步推送日志信息的功能,這樣如果大量的Logging Event進入AsyncAppender,就可以游刃有余地處理這些日志信息了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM