解決線上日志的bug定位問題的slf4j擴展工具包:eslf4j
eslf4j(expand slf4j)是基于slf4j的一個擴展工具包,主要用于解決線上日志的bug定位問題。
對于大并發的網站,定位bug一直是個頭疼的問題,為了定位問題而記錄大量的debug或info日志,很可能會影響性能,而且大量的日志對于日志分析也很不友好,還會占用大量磁盤空間;所以很多人的選擇是啟用error級別的日志,但是在這種情況下,如果線上出現了bug,往往只有一條錯誤日志,這對于定位問題幾乎沒有任何幫助,因為導致這個error往往是由于上下文的一個或幾個錯誤數據或操作導致的,而上下文的info或debug日志并沒有輸出。
eslf4j能夠控制打印上下文日志,比如可以定義線上日志的級別為error以輸出最少的日志,并且配置eslf4j使得一旦出現error,能同時打印出上下文的info或者debug信息。這樣既能保證性能,也方便定義問題。
eslf4j配置:
count=100
buffersize=10m
minthreshold=debug
filter=com.jd.o2o.filter.Null1Filter
filter=com.jd.o2o.filter.Null2Filter
memorymanager=com.jd.o2o.memory.NullMemoryManager
-
count為上下文的日志數量,必須配置(否則可能會造成內存泄露,這跟線程連接池和ThreadLocal的實現有關,就不詳解了);比如這里配置為100,表示一旦打印一條日志,會同時打印出該條日志前的100條日志。
-
buffersize 為eslf4j緩存的日志所占用的空間,必須配置,當緩存達到配置的大小時就會使用配置的memorymanager來釋放內存;這里配置的 buffersize為10m,表示緩存最多會占用10m內存,另外支持單位b(比特),k(kb),g(gb)
-
minthreshold為緩存的最低閘值,必須配置,支持all,trace,debug,info,warn,error,fatal和off;比如這里配置為debug,只有級別大于或等于debug的日志才會被緩存并打印出來。
-
filter是日志過濾器,是一個擴展點,可以配置也可以不配置,當然也可以配置多個;filter需要實現com.jd.o2o.core.filter.Filter接口,而且需要一個無參構造器;filter會在日志被緩存前調用,可以自處理日志。
-
memorymanager 用于管理內存,也是一個擴展點,可以配置也可以不配置,memorymanager需要實現 com.jd.o2o.core.memory.IMemoryManager接口,而且需要一個無參構造器,如果不配置會默認使用 com.jd.o2o.core.memory.impl.DefaultMemoryManagerImpl來管理內存,memorymanager會在日志緩存達到buffersize時調用來釋放內存。
eslf4j demo:
線上日志級別為 error,eslf4j配置的count為100,minthreshold為debug;假設活動線程數為1000,error錯誤率為 1/1000;當一個線程出現error時,會打印出該線程下出現該error的前100條debug級別或debug級別以上的日志;而其它999個線程日志都不會輸出。