1. 程式人生 > 程式設計 >SpringBoot AOP處理請求日誌列印功能程式碼例項

SpringBoot AOP處理請求日誌列印功能程式碼例項

設計原則和思路:

  • 元註解方式結合AOP,靈活記錄操作日誌
  • 能夠記錄詳細錯誤日誌為運營以及審計提供支援
  • 日誌記錄儘可能減少效能影響
  • 操作描述引數支援動態獲取,其他引數自動記錄。

程式碼例項如下

@Slf4j
@Aspect
@Configuration
public class RequestAopConfig {

  @Autowired
  private HttpServletRequest request;

  private static final ThreadLocal<Long> START_TIME_MILLIS = new ThreadLocal<>();

  @Pointcut("execution(* com.xxx.xxx.xxx..*(..)) " +
      "&&(@annotation(org.springframework.web.bind.annotation.PostMapping)" +
      "||@annotation(org.springframework.web.bind.annotation.GetMapping)" +
      "||@annotation(org.springframework.web.bind.annotation.PutMapping)" +
      "||@annotation(org.springframework.web.bind.annotation.DeleteMapping))")
  public void controllerMethodPointcut() {
  }

  /**
   * 前置通知:在某連線點之前執行的通知,但這個通知不能阻止連線點之前的執行流程(除非它丟擲一個異常)。
   *
   * @param joinPoint 引數
   */
  @Before("controllerMethodPointcut()")
  public void before(JoinPoint joinPoint) {
    START_TIME_MILLIS.set(System.currentTimeMillis());
  }

  /**
   * 後置通知:在某連線點正常完成後執行的通知,通常在一個匹配的方法返回的時候執行。
   *
   * @param joinPoint 引數
   */
  @AfterReturning(value = "controllerMethodPointcut()",returning = "result")
  public void afterReturning(JoinPoint joinPoint,Object result) {
    String logTemplate = "--------------- 執行成功 ---------------\n請求開始---Send Request URL: {},Method: {},Params: {} \n請求方法---ClassName: {},[Method]: {},execution time: {}ms \n請求結束---Send Response Result: {}";
    log.info(logTemplate,request.getRequestURL(),request.getMethod(),JSON.toJSONString(joinPoint.getArgs()),joinPoint.getSignature().getDeclaringTypeName(),joinPoint.getSignature().getName(),(System.currentTimeMillis() - START_TIME_MILLIS.get()),JSON.toJSONString(result));
    START_TIME_MILLIS.remove();
  }

  /**
   * 異常通知:在方法丟擲異常退出時執行的通知。
   *
   * @param joinPoint 引數
   */
  @AfterThrowing(value = "controllerMethodPointcut()",throwing = "ex")
  public void afterThrowing(JoinPoint joinPoint,Throwable ex) {
    String logTemplate = "--------------- 執行失敗 ---------------\n異常請求開始---Send Request URL: {},Params: {} \n異常請求方法---ClassName: {},execution time: {}ms \n異常請求結束---Exception Message: {}";
    log.error(logTemplate,ex.getMessage());
    START_TIME_MILLIS.remove();
  }

  /**
   * 最終通知。當某連線點退出的時候執行的通知(不論是正常返回還是異常退出)。
   *
   * @param joinPoint
   */
  @After("controllerMethodPointcut()")
  public void after(JoinPoint joinPoint) {
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。