1. 程式人生 > >基於AOP和ThreadLocal實現日誌記錄

基於AOP和ThreadLocal實現日誌記錄

### 基於AOP和ThreadLocal實現的一個日誌記錄的例子 主要功能實現 : 在API每次被請求時,可以在整個方法呼叫鏈路中記錄一條唯一的API請求日誌,可以記錄請求中絕大部分關鍵內容。並且可以自定義實現對日誌收集(直接標準輸出,或寫入到檔案或資料庫)。 比如傳參,響應,請求url,請求方法,clientIp,耗時,請求成功或異常,請求頭等等。 #### 實現的核心為AOP以及ThreadLocal。 - AOP 會切所有被`@Log4a`註解的方法,會記錄一個執行緒中唯一一個Log4物件,讀取AOP中的方法資訊(入參,方法等等) - 抓取請求的內容和HttpServletRequest中的內容,解析入參。 - 日誌收集(自定義實現,建議該過程非同步) - 記錄無論目標方法成功或失敗,在執行完成後都將對ThreadLocal中的資源進行釋放。 #### Log4 記錄的內容 欄位| 型別|註釋| 是否預設記錄| ---|---|---|---| clientIp| String| 請求客戶端的Ip| 是 reqUrl| String| 請求地址| 是 headers| Object| 請求頭部資訊(可選擇記錄)| 是,預設記錄user-agent,content-type type | String| 操作型別| 是,預設值undefined content|StringBuilder| 步驟內容資訊| 否,方法內容,可使用Log4.step進行內容步驟記錄 #### Log4a 註解選項說明 欄位| 型別|註釋| 預設| ---|---|---|---| type| String| 操作型別| 預設值"undefined" method| boolean| 是否記錄請求的本地java方法| true costTime| boolean| 是否記錄整個方法耗時| true headers |String[]| 記錄的header資訊| 預設"User-Agent","content-type" args| boolean |是否記錄請求引數| true respBody| boolean |是否記錄響應引數| true stackTrace| boolean| 當目標方法發生異常時,是否追加異常堆疊資訊到content| false costTime| boolean |是否記錄整個方法耗時| true collector| Class| 指定日誌收集器| 預設空的收集器不指定 #### 例子使用說明 ##### @Log4a註解使用 直接在Controller 方法或類上加上註解`@Log4a`,可以對該Controller中所有方法進行日誌記錄與收集 例如 : ```java @Log4a(type = "測試API", stackTrace = true) @RestController public class DemoController { @Resource private DemoService demoService; /** * JSON資料測試 */ @PostMapping("/sayHello") public ResponseEntity sayHello(@Request