基於AOP和ThreadLocal實現日誌記錄
阿新 • • 發佈:2020-06-29
### 基於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