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,就可以游刃有余地處理這些日志信息了。