注意:該功能須要高版本才能支持,如1.0.11。
AsyncAppender,異步記錄日誌。
工做原理:
當Logging Event進入AsyncAppender後,AsyncAppender會調用appender方法,append方法中在將event填入Buffer(這裏選用的數據結構爲BlockingQueue)中前,會先判斷當前buffer的容量以及丟棄日誌特性是否開啓,當消費能力不如生產能力時,AsyncAppender會超出Buffer容量的Logging Event的級別,進行丟棄,做爲消費速度一旦跟不上生產速度,中轉buffer的溢出處理的一種方案。AsyncAppender有個線程類Worker,它是一個簡單的線程類,是AsyncAppender的後臺線程,所要作的工做是:從buffer中取出event交給對應的appender進行後面的日誌推送。
從上面的描述中能夠看出,AsyncAppender並不處理日誌,只是將日誌緩衝到一個BlockingQueue裏面去,並在內部建立一個工做線程從隊列頭部獲取日誌,以後將獲取的日誌循環記錄到附加的其餘appender上去,從而達到不阻塞主線程的效果。所以AsynAppender僅僅充當事件轉發器,必須引用另外一個appender來作事。
在使用AsyncAppender的時候,有些選項仍是要注意的。因爲使用了BlockingQueue來緩存日誌,所以就會出現隊列滿的狀況。正如上面原理中所說的,在這種狀況下,AsyncAppender會作出一些處理:默認狀況下,若是隊列80%已滿,AsyncAppender將丟棄TRACE、DEBUG和INFO級別的event,從這點就能夠看出,該策略有一個驚人的對event丟失的代價性能的影響。另外其餘的一些選項信息,也會對性能產生影響,下面列出經常使用的幾個屬性配置信息: