作者部落格:
個人部落格純淨版
開發排查系統問題用得最多的手段就是檢視系統日誌,在分布式環境中一般使用elk來統一收集日誌,但是在併發大時使用日誌定位問題還是比較麻煩,由於大量的其他使用者/其他執行緒的日誌也一起輸出穿行其中導致很難篩選出指定請求的全部相關日誌,以及下游執行緒/服務對應的日誌。
每個請求都使用乙個唯一標識來追蹤全部的鏈路顯示在日誌中,並且不修改原有的列印方式(**無入侵)使用logback的mdc機制日誌模板中加入traceid標識,取值方式為%x
由於mdc內部使用的是threadlocal所以只有本執行緒才有效,子執行緒和下游的服務mdc裡的值會丟失;所以方案主要的難點是解決值的傳遞問題,主要包括以幾下部分:
logback配置檔案模板格式新增標識%x
生成traceid並通過header傳遞給下游服務
@component
public class tracefilter extends zuulfilter
@override
public int filterorder()
@override
public boolean shouldfilter()
@override
public object run()
}
接收並儲存traceid的值***
public class traceinterceptor implements handlerinterceptor
return true;}}
註冊***
public class defaultwebmvcconfig extends webmvcconfigurationsupport
}
繼續把當前服務的traceid值傳遞給下游服務
public class feigninterceptorconfig
};return requestinterceptor;}}
主要針對業務會使用執行緒池(非同步、並行處理),並且spring自己也有@async註解來使用執行緒池,要解決這個問題需要以下兩個步驟
重寫logback的logbackmdcadapter
由於logback的mdc實現內部使用的是threadlocal不能傳遞子執行緒,所以需要重寫替換為阿里的transmittablethreadlocal
ttlmdcadapter類
package org.slf4j;
import com.alibaba.ttl.transmittablethreadlocal;
import org.slf4j.spi.mdcadapter;
public class ttlmdcadapter implements mdcadapter
public static mdcadapter getinstance()
其他**與ch.qos.logback.classic.util.logbackmdcadapter一樣,只需改為呼叫copyoninheritthreadlocal變數ttlmdcadapterinitializer類用於程式啟動時載入自己的mdcadapter實現
@override
//載入ttlmdcadapter例項
ttlmdcadapter.getinstance();
}}增加ttlrunnable和ttlcallable擴充套件實現ttl
閘道器生成traceid值為13d9800c8c7944c78a06ce28c36de670
顯示的traceid與閘道器相同,這裡特意模擬發生異常的場景
當系統出現異常時,可直接通過該異常日誌的traceid的值,在日誌中心中詢該請求的所有日誌資訊
掃一掃,支援下作者吧
日誌排查問題總結
寫在前面 因為公司負責的專案流程鏈路很長,經常需要排查問題定位問題。目前專案是把每個service的方法前後都加上了入參和返回值的列印。接管專案後,總結了一下通過日誌定位問題的經驗,希望以後排查問題能有一些幫助。第二版 運單後台排查問題的方法總結 邏輯熟悉時 4.再根據測試 現場人員描述的描述以及自...
如何使錯誤日誌更加方便排查問題
在程式中打錯誤日誌的主要目標是為更好地排查問題和解決問題提供重要線索和指導。但是在實際中打的錯誤日誌內容和格式變化多樣,錯誤提示上可能殘缺不全 沒有相關背景 不明其義,使得排查解決問題成為非常不方便或者耗時的操作。而實際上,如果程式設計的時候稍加用心,就會減少排查問題的很多無用功。在闡述如何編寫有效...
排查問題 檢視日誌的正確開啟方式
開啟超大日誌檔案,檢視日誌 用分割檔案的命令 split b 200m catalina.out 每個檔案200m 檢視日誌 方式一 tail f aaa.log 實時follow aaa.log n x aaa.log x 最後幾行 xf aaa.log 注 tailf 等同於tail f n 1...