1. 程式人生 > 其它 >springboot使用aop記錄介面操作日誌

springboot使用aop記錄介面操作日誌

技術標籤:後端aopspring boot

  1. 國際慣例,新增依賴
    在這裡插入圖片描述
  2. 我們先自定義一個註解,有關自定義註解的說明可自行百度。
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
    /**
     * 模組 
     */
    String title() default "";

    /**
     * 功能
     */
    BusinessType businessType() default BusinessType.OTHER;
}
  1. 切面類編寫
@Aspect
@Component
public class LogAspect {
    private static final Logger log = LoggerFactory.getLogger(LogAspect.class);
    @Autowired
    private SysOperateLogService sysOperateLogService;

    /**配置切入點*/
    @Pointcut("@annotation(com.ews.framework.common.annotation.Log)")
    public void logPointCut() {
    }

    /**
     * 處理完請求後執行
     * @param joinPoint 切點
     */
    @AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")
    public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) {
        handleLog(joinPoint, null, jsonResult);
    }

    /**
     * 攔截異常操作
     * @param joinPoint 切點
     * @param e 異常
     */
    @AfterThrowing(value = "logPointCut()", throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint, Exception e) {
    }
    
    /**
     * 日誌處理邏輯
     * @param point 切點
     * @param e 異常
     * @param jsonResult json結果
     */
    public void handleLog(final JoinPoint point, final Exception e, Object jsonResult) {
        Signature signature = point.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        if (method == null){
            return;
        }
        //系統操作日誌
        SysOperateLog sysOperateLog = new SysOperateLog();
        sysOperateLog.setId(IdUtils.simpleUUID());
        //獲取註解資訊
        Log logAnnotation = method.getAnnotation(Log.class);
        if (logAnnotation == null){
            return;
        }
        //請求的方法名
        String className = point.getTarget().getClass().getName();
        String methodName = point.getSignature().getName();
        sysOperateLog.setRequestMethod(className + "." + methodName + "()");
        sysOperateLog.setRequestWay(ServletUtils.getRequest().getMethod());
        sysOperateLog.setRequestIp(ServletUtils.getRequest().getRemoteAddr());
        sysOperateLog.setRequestUrl(ServletUtils.getRequest().getRequestURI());
        sysOperateLog.setResultParam(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000));
        sysOperateLog.setOperateStatus(BusinessStatus.SUCCESS.ordinal());
        if (e != null) {
            sysOperateLog.setOperateStatus(BusinessStatus.FAIL.ordinal());
            sysOperateLog.setErrorMessage(StringUtils.substring(e.getMessage(), 0, 2000));
        }
        sysOperateLog.setOperateTime(new Date());
        //處理設定註解上的引數
        getControllerMethodDescription(logAnnotation, sysOperateLog);
        //請求的方法引數值
        Object[] args = point.getArgs();
        sysOperateLog.setRequestParam(JSON.toJSONString(args));
        log.info("===引數為:" + JSON.toJSONString(args));
        //請求的方法引數名稱
        LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
        sysOperateLog.setId(IdUtils.randomUUID());
        sysOperateLogService.insertSysOperateLog(sysOperateLog);
    }

    /**
     * 獲取註解中對方法的描述資訊 用於Controller層註解
     * @param log 日誌
     * @param operLog 操作日誌
     */
    public void getControllerMethodDescription(Log log, SysOperateLog operLog) {
        //設定action動作
        operLog.setBusinessType(log.businessType().ordinal());
        //設定標題
        operLog.setOperateTitle(log.title());
    }
} 
  1. controller介面新增@Log註解。