浏览代码

添加接口请求日志记录

helongjun 3 年之前
父节点
当前提交
dfc567e38a

+ 13 - 0
src/main/java/com/ads/business/dao/SysReqLogDao.java

@@ -0,0 +1,13 @@
+package com.ads.business.dao;
+
+import com.ads.business.entity.SysReqLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * Create by HeLongJun on 2022/2/24 17:55
+ *
+ * @author lanrenspace@163.com
+ * @Description:
+ */
+public interface SysReqLogDao extends BaseMapper<SysReqLog> {
+}

+ 61 - 0
src/main/java/com/ads/business/entity/SysReqLog.java

@@ -0,0 +1,61 @@
+package com.ads.business.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Create by HeLongJun on 2022/2/24 17:34
+ *
+ * @author lanrenspace@163.com
+ * @Description:
+ */
+@Data
+@TableName("sys_req_log")
+public class SysReqLog implements Serializable {
+
+    /**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 操作IP
+     */
+    private String ip;
+
+    /**
+     * 操作方法
+     */
+    private String method;
+
+    /**
+     * 请求路径
+     */
+    private String requestUrl;
+
+    /**
+     * 请求参数
+     */
+    private String requestParam;
+
+    /**
+     * 请求类型
+     */
+    private String requestType;
+
+    /**
+     * 操作耗时
+     */
+    private Long costTime;
+
+    /**
+     * 创建日期
+     */
+    private Date createTime;
+}

+ 13 - 0
src/main/java/com/ads/business/service/SysReqLogService.java

@@ -0,0 +1,13 @@
+package com.ads.business.service;
+
+import com.ads.business.entity.SysReqLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * Create by HeLongJun on 2022/2/24 17:56
+ *
+ * @author lanrenspace@163.com
+ * @Description:
+ */
+public interface SysReqLogService extends IService<SysReqLog> {
+}

+ 17 - 0
src/main/java/com/ads/business/service/impl/SysReqLogServiceImpl.java

@@ -0,0 +1,17 @@
+package com.ads.business.service.impl;
+
+import com.ads.business.dao.SysReqLogDao;
+import com.ads.business.entity.SysReqLog;
+import com.ads.business.service.SysReqLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * Create by HeLongJun on 2022/2/24 17:58
+ *
+ * @author lanrenspace@163.com
+ * @Description:
+ */
+@Service
+public class SysReqLogServiceImpl extends ServiceImpl<SysReqLogDao, SysReqLog> implements SysReqLogService {
+}

+ 72 - 0
src/main/java/com/ads/common/aop/RequestLogAspect.java

@@ -0,0 +1,72 @@
+package com.ads.common.aop;
+
+import com.ads.business.entity.SysReqLog;
+import com.ads.business.service.SysReqLogService;
+import com.ads.common.util.IPUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import java.lang.reflect.Method;
+import java.util.Date;
+
+/**
+ * Create by HeLongJun on 2022/2/24 17:39
+ *
+ * @author lanrenspace@163.com
+ * @Description:
+ */
+@Aspect
+public class RequestLogAspect {
+
+    @Autowired
+    private SysReqLogService reqLogService;
+
+
+    @Pointcut("execution(public * com.ads.business.api.*.*(..)) " +
+            "|| execution(public * com.ads.business.controller.*.*(..))")
+    public void pointcut() {
+    }
+
+
+    @Around("pointcut()")
+    public Object around(ProceedingJoinPoint point) throws Throwable {
+        long startTime = System.currentTimeMillis();
+        Object result = point.proceed();
+        long time = System.currentTimeMillis() - startTime;
+        saveLog(point, time);
+        return result;
+    }
+
+    private void saveLog(ProceedingJoinPoint joinPoint, long time) {
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        Method method = signature.getMethod();
+        SysReqLog sysLog = new SysReqLog();
+        String className = joinPoint.getTarget().getClass().getName();
+        String methodName = signature.getName();
+        sysLog.setMethod(className + "." + methodName + "()");
+
+        Object[] args = joinPoint.getArgs();
+        LocalVariableTableParameterNameDiscoverer lvpnd = new LocalVariableTableParameterNameDiscoverer();
+        String[] parameterNames = lvpnd.getParameterNames(method);
+        if (args != null && parameterNames != null) {
+            String params = "";
+            for (int i = 0; i < args.length; i++) {
+                params += "  " + parameterNames[i] + ": " + args[i];
+            }
+            sysLog.setRequestParam(params);
+        }
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        sysLog.setIp(IPUtils.getIpAddr(attributes.getRequest()));
+        sysLog.setRequestUrl(attributes.getRequest().getRequestURI());
+        sysLog.setCostTime(time);
+        sysLog.setCreateTime(new Date());
+        reqLogService.save(sysLog);
+    }
+}

+ 6 - 0
src/main/java/com/ads/common/config/AdsConfig.java

@@ -1,5 +1,6 @@
 package com.ads.common.config;
 
+import com.ads.common.aop.RequestLogAspect;
 import com.ads.common.data.GetPictureConfigInData;
 import com.ads.common.interceptor.SecurityInterceptor;
 import com.alibaba.fastjson.serializer.SerializerFeature;
@@ -98,4 +99,9 @@ public class AdsConfig extends WebMvcConfigurationSupport {
         // 将fastjson添加到视图消息转换器列表内
         converters.add(fastConverter);
     }
+
+    @Bean
+    public RequestLogAspect logAspect() {
+        return new RequestLogAspect();
+    }
 }

+ 32 - 0
src/main/java/com/ads/common/util/IPUtils.java

@@ -0,0 +1,32 @@
+package com.ads.common.util;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * Create by HeLongJun on 2022/2/24 17:54
+ *
+ * @author lanrenspace@163.com
+ * @Description:
+ */
+public class IPUtils {
+
+    /**
+     * 获取ip地址
+     * @param request
+     * @return
+     */
+    public static String getIpAddr(HttpServletRequest request) {
+
+        String ip = request.getHeader("x-forwarded-for");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
+    }
+}

+ 16 - 0
src/main/resources/mapper/SysReqLog.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ads.business.dao.SysReqLogDao">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.ads.business.entity.SysReqLog">
+        <id column="id" property="id"/>
+        <result column="ip" property="ip"/>
+        <result column="method" property="method"/>
+        <result column="request_url" property="requestUrl"/>
+        <result column="request_param" property="requestParam"/>
+        <result column="request_type" property="requestType"/>
+        <result column="cost_time" property="costTime"/>
+        <result column="create_time" property="createTime"/>
+    </resultMap>
+</mapper>