程式設計師在開發計畫時,需要編寫大量的日誌,因為日誌不僅可以監控系統執行狀態,還能幫助我們進行故障排查和偵錯。
一個典型的日誌套用場景是:監控所有介面的執行情況。
怎麽實作這個需求呢?難道要一個一個寫
log.info
嗎?
其實如果是在 Spring 計畫中,我們可以透過 AOP 機制來實作這個需求。
範例程式碼如下:
/**
* 請求日誌 AOP
*
**/
@Aspect
@Component
@Slf4j
public classLogInterceptor{
/**
* 執行攔截
*/
@Around("execution(* com.yupi.springbootinit.controller.*.*(..))")
public Object doInterceptor(ProceedingJoinPoint point)throws Throwable {
// 計時
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// 獲取請求路徑
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
HttpServletRequest httpServletRequest = ((ServletRequestAttributes) requestAttributes).getRequest();
// 生成請求唯一 id
String requestId = UUID.randomUUID().toString();
String url = httpServletRequest.getRequestURI();
// 獲取請求參數
Object[] args = point.getArgs();
String reqParam = "[" + StringUtils.join(args, ", ") + "]";
// 輸出請求日誌
log.info("request start,id: {}, path: {}, ip: {}, params: {}", requestId, url,
httpServletRequest.getRemoteHost(), reqParam);
// 執行原方法
Object result = point.proceed();
// 輸出響應日誌
stopWatch.stop();
long totalTimeMillis = stopWatch.getTotalTimeMillis();
log.info("request end, id: {}, cost: {}ms", requestId, totalTimeMillis);
return result;
}
}
完整程式碼片段來源於程式碼小抄,歡迎點選進入小程式閱讀!
線上存取:https://www.codecopy.cn/post/4855ct