1. 程式人生 > >給日誌打標籤,讓你的日誌定位再無困難

給日誌打標籤,讓你的日誌定位再無困難

## 背景 不知道各位在生產日誌中定位問題時有沒有碰到這樣的場景:由於coding的時候日誌輸出的比較少,出現問題時,很難通過日誌去定位到問題。又或者是,你明明coding的時候有輸出日誌。但是在龐大的日誌檔案中,由於業務執行緒併發比較多,你輸出的日誌又沒有加關鍵資訊。你也很難定位到你所需要的日誌資訊。
之前在公司裡寫業務程式碼時,為了使每個RPC呼叫能被日誌記錄下來,我們在公司基礎元件裡定義了一個切面,攔截所有的RPC呼叫,方法開始之前,在日誌裡輸出呼叫的服務和方法以及引數,方法結束時輸出方法的耗時。我相信很多人也是這麼做的。
這樣一來 ,所有的呼叫都能通過引數裡的關鍵資訊被搜尋到。也能定位到呼叫是什麼結束的以及耗時。
但是在有些業務方法中,也打上了很多的業務日誌。由於核心業務的tps和qps很高,日誌是互相穿插的。如果你的日誌沒有打上關鍵的業務資訊(比如訂單號,業務ID),那就很難在日誌中被定位出來。
也許有些童鞋會說,用執行緒號呀。通過搜尋業務ID定位到呼叫開始的地方,再搜尋這條執行緒的執行緒號,就可以定位整個請求的所有日誌。其實之前我也是這麼幹的,但是執行緒一般都是由執行緒池進行管理的,在tps很高的業務中,同一個執行緒號有可能短時間會出現多次,但是卻是不同的請求。而且業務方法中可能也會有非同步執行緒,導致了執行緒號會變。這樣對於定位日誌就又增加了難度。當然最後可以通過對時間戳的分析,還是可以定位到具體日誌。但是這樣就增加了定位的時間成本。
如果你的公司對微服務使用了分散式追蹤,那麼定位日誌可以通過traceId來解決。如果沒有在生產上應用分散式追蹤,又想在併發比較高的應用的日誌上快速定位到所需要的日誌。其中一個比較有效的辦法就是:`規範日誌的輸出格式`。
在每行日誌輸出時儘可能的加上關鍵的業務資訊,然後定位起來就比較清晰了,例如:
![file](https://img2020.cnblogs.com/other/268224/202007/268224-20200718191056533-142497197.png)
這裡每一行日誌都加上了訂單號和請求ID,我們把這樣的日誌頭資訊稱之為`日誌標籤`,有了這些標籤定位起來就比較容易了。
那這樣是不是意味著每寫一行日誌,都必須加上這樣日誌標籤資訊呢?這是不是也麻煩了?
答案是不用的。
推薦一款自動給日誌打標籤實現精確定位的日誌切面框架,你使用了這個,你的日誌可以實現自定義的業務標籤!
點選[Aspect-log](https://gitee.com/bryan31/aspect-log)跳轉到開源主頁,或者複製以下地址: > https://gitee.com/bryan31/aspect-log ![file](https://img2020.cnblogs.com/other/268224/202007/268224-20200718191057104-676422205.jpg)
## Aspect-log介紹 這是一款小巧,輕量級,對業務幾乎無侵入的日誌切面框架。特性為: * 使用簡單,不侵入業務程式碼。只需要在方法上配置標註 * 支援log4j,logback,log4j2三種常見的日誌框架 * 配置極其簡單。提供“一鍵配置”,自動識別日誌框架 * 在方法上配置,無論呼叫多深或者非同步呼叫。也可以統一加上日誌標籤 * 無效能損耗 使用方法很簡單,如果你是springboot,aspect-log提供了自動裝配,GAV為: ```xml ``` 如果你是spring,GAV為: ```xml ```

## 配置方式 如果你使用spring,需要在專案裡的application.xml裡定義: