2014-06-12 74 views
14

我知道AsyncAppender在分隔線程中執行附加作業。爲此,他們使用ArrayBlockingQueue。Log4j2中Asynclogger和AsyncAppender之間的區別

AsyncLogger使用LMAX干擾物庫從一個應用程序線程移動記錄事件給其他線程,它是更快comapred到AsyncAppender。

我的問題是爲什麼我們在AsyncAppender如果log4j2它做的工作是由AsyncLogger更efficently實現。

如果我們與AsyncLogger一起使用AsyncAppender會怎樣? AsyncLogger和AsyncAppender之間還有什麼區別嗎?

回答

13

確實,他們達到了幾乎相同的目的,所以我可以理解你的問題:「爲什麼有兩個選項」?

對於背景下,AsyncAppender一直在Log4j2從一開始,在異步記錄儀是在去年三月(2014)加入。這就是目前的情況。

log4j團隊目前並不認真考慮移除AsyncAppender。有一件事要記住,異步記錄器有一個外部依賴項(LMAX disruptor jar),AsyncAppender只與log4j2-api和log4j2-core jar一起工作。

要回答你的最後一個問題,可以將AsyncAppender與Async Loggers組合起來,但是你不會獲得任何東西。這尚未經過測試。我沒有檢查過,但在將日誌事件從Async Logger線程移交給AsyncAppender線程時,可能會出現位置信息丟失的問題。我不會推薦這樣做。

更新(2014年6月23日):我做了一些測試,並有與AsyncAppender與AsyncLoggers結合的幾個問題。這些在RC2中修復。我仍然不建議這樣做,因爲它只是增加了另一個使用CPU /內存而不貢獻任何內容的中間步驟。

UPDATE(2016年7月20日):另一個區別:由於2.6版本,Log4j的2可以是垃圾自由帶有Async記錄器,但不與AsyncAppender。


在回答在下面的評論你的第二個問題:AsyncAppender有其自己的隊列和線程,其中AsyncLoggers使用LMAX干擾器ringbuffer的隊列,並使用一個執行程序線程。

+0

感謝Remko.i明白,對於異步記錄器你需要干擾jar.AsyncAppender執行asynclogger的append方法分離thread.Is AsyncLogger也執行append方法在分離線程或不同的東西。請澄清 –