1. 程式人生 > >spring boot aop記錄介面呼叫情況

spring boot aop記錄介面呼叫情況

引入依賴

<!-- 引入aop-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

定義日誌實體


import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableName;
import lombok.Data;

@Data
@TableName("t_cmp_interlog")
public class InterFaceLog {

    @TableField("url")
    private String url;
    @TableField("method")
    private String method;
    @TableField("param")
    private String param;
    @TableField("callTm")
    private String callTm;
    @TableField("callerID")
    private Integer callerID;
    @TableField("callerAcc")
    private String callerAcc;
    @TableField("time")
    private Long time;
    @TableField("id")
    private String id;
    @TableField("remake")
    private String remake;
    @TableField("remoteAddr")
    private String remoteAddr;
    @TableField("class_method")
    private String class_method;
    @TableField("result")
    private String result;

}

切面實現日誌記錄,切面在controller層


import cn.com.suntree.cmp.common.ApiResult;
import cn.com.suntree.cmp.entity.InterFaceLog;
import cn.com.suntree.cmp.entity.SysUser;
import cn.com.suntree.cmp.service.InterFaceLogService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Date;
import java.util.UUID;

@Aspect
@Component
public class WebLogAspect {
    @Autowired
    InterFaceLogService logService;

    ThreadLocal<Long> startTime = new ThreadLocal<>();
    ThreadLocal<InterFaceLog> log = new ThreadLocal<>();
    InterFaceLog interfaceLog =  new InterFaceLog();

    @Pointcut("execution(public * cn.com.suntree.cmp.controller.*.*(..))")
    public void webLog(){}

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 接收到請求,記錄請求內容
        startTime.set(System.currentTimeMillis());
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String url = request.getRequestURL().toString();
        String method = request.getMethod();
        String remoteAddr = request.getRemoteAddr();
        String class_method = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName();
        String param = Arrays.toString(joinPoint.getArgs());

        SysUser loginUser = CommonUtil.getLoginUser();
        if (!CommonUtil.check(loginUser)){
            return;
        }
        interfaceLog.setCallerAcc(loginUser.getAccNum());
        interfaceLog.setCallerID(loginUser.getUserID());
        interfaceLog.setClass_method(class_method);
        interfaceLog.setMethod(method);
        interfaceLog.setUrl(url);
        interfaceLog.setRemoteAddr(remoteAddr);
        interfaceLog.setParam(param);
        log.set(interfaceLog);
    }

    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {
    String result = ret.toString();
        InterFaceLog logAfter =  log.get();
        Long time = System.currentTimeMillis() - startTime.get();
        logAfter.setResult(result);
        logAfter.setCallTm(DateUtil.dateToYMDHMS(new Date()));
        logAfter.setTime(time);
        logAfter.setId(UUID.randomUUID().toString());
        ApiResult apiResult = logService.addLog(logAfter);
        System.out.println("apiResult ------------ "+apiResult);
        System.out.println(logAfter);
    }
}

存入資料庫步驟省略