解決線上日志的bug定位問題的slf4j擴展工具包:eslf4j

jopen 9年前發布 | 15K 次閱讀 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

  1. count為上下文的日志數量,必須配置(否則可能會造成內存泄露,這跟線程連接池和ThreadLocal的實現有關,就不詳解了);比如這里配置為100,表示一旦打印一條日志,會同時打印出該條日志前的100條日志。

  2. buffersize 為eslf4j緩存的日志所占用的空間,必須配置,當緩存達到配置的大小時就會使用配置的memorymanager來釋放內存;這里配置的 buffersize為10m,表示緩存最多會占用10m內存,另外支持單位b(比特),k(kb),g(gb)

  3. minthreshold為緩存的最低閘值,必須配置,支持all,trace,debug,info,warn,error,fatal和off;比如這里配置為debug,只有級別大于或等于debug的日志才會被緩存并打印出來。

  4. filter是日志過濾器,是一個擴展點,可以配置也可以不配置,當然也可以配置多個;filter需要實現com.jd.o2o.core.filter.Filter接口,而且需要一個無參構造器;filter會在日志被緩存前調用,可以自處理日志。

  5. 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個線程日志都不會輸出。

項目主頁:http://www.baiduhome.net/lib/view/home/1434958319997

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!