新增 AOP 切面,修改日志输出整合流水号
This commit is contained in:
		@@ -47,8 +47,8 @@
 | 
			
		||||
            <scope>provided</scope>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>com.github.xiaoymin</groupId>
 | 
			
		||||
            <artifactId>knife4j-spring-boot-starter</artifactId>
 | 
			
		||||
            <groupId>org.springframework.boot</groupId>
 | 
			
		||||
            <artifactId>spring-boot-starter-aop</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
    </dependencies>
 | 
			
		||||
    <properties>
 | 
			
		||||
 
 | 
			
		||||
@@ -64,6 +64,10 @@
 | 
			
		||||
            <artifactId>velocity-engine-core</artifactId>
 | 
			
		||||
            <version>2.0</version>
 | 
			
		||||
        </dependency>
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>cn.hutool</groupId>
 | 
			
		||||
            <artifactId>hutool-all</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
    </dependencies>
 | 
			
		||||
    <properties>
 | 
			
		||||
        <maven.compiler.source>8</maven.compiler.source>
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,100 @@
 | 
			
		||||
package com.yovinchen.xlcs.common.aspect;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.util.RandomUtil;
 | 
			
		||||
import com.alibaba.fastjson.JSONObject;
 | 
			
		||||
import com.alibaba.fastjson.support.spring.PropertyPreFilters;
 | 
			
		||||
import org.aspectj.lang.JoinPoint;
 | 
			
		||||
import org.aspectj.lang.ProceedingJoinPoint;
 | 
			
		||||
import org.aspectj.lang.Signature;
 | 
			
		||||
import org.aspectj.lang.annotation.Around;
 | 
			
		||||
import org.aspectj.lang.annotation.Aspect;
 | 
			
		||||
import org.aspectj.lang.annotation.Before;
 | 
			
		||||
import org.aspectj.lang.annotation.Pointcut;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
import org.slf4j.MDC;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import org.springframework.web.context.request.RequestContextHolder;
 | 
			
		||||
import org.springframework.web.context.request.ServletRequestAttributes;
 | 
			
		||||
import org.springframework.web.multipart.MultipartFile;
 | 
			
		||||
 | 
			
		||||
import javax.servlet.ServletRequest;
 | 
			
		||||
import javax.servlet.ServletResponse;
 | 
			
		||||
import javax.servlet.http.HttpServletRequest;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClassName: LogAspect
 | 
			
		||||
 * Package: com.yovinchen.xlcs.common.aspect
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @Create 2024/1/23 10:43
 | 
			
		||||
 */
 | 
			
		||||
@Aspect
 | 
			
		||||
@Component
 | 
			
		||||
public class LogAspect {
 | 
			
		||||
    private final static Logger LOG = LoggerFactory.getLogger(LogAspect.class);
 | 
			
		||||
 | 
			
		||||
    public LogAspect() {
 | 
			
		||||
        System.out.println("Common LogAspect");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 定义一个切点
 | 
			
		||||
     */
 | 
			
		||||
    @Pointcut("execution(public * com.yovinchen.xlcs..*Controller.*(..))")
 | 
			
		||||
    public void controllerPointcut() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Before("controllerPointcut()")
 | 
			
		||||
    public void doBefore(JoinPoint joinPoint) {
 | 
			
		||||
 | 
			
		||||
        MDC.put("LOG_ID", System.currentTimeMillis() + RandomUtil.randomString(3));
 | 
			
		||||
        // 开始打印请求日志
 | 
			
		||||
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
 | 
			
		||||
        HttpServletRequest request = attributes.getRequest();
 | 
			
		||||
        Signature signature = joinPoint.getSignature();
 | 
			
		||||
        String name = signature.getName();
 | 
			
		||||
 | 
			
		||||
        // 打印请求信息
 | 
			
		||||
        LOG.info("------------- 开始 -------------");
 | 
			
		||||
        LOG.info("请求地址: {} {}", request.getRequestURL()
 | 
			
		||||
                .toString(), request.getMethod());
 | 
			
		||||
        LOG.info("类名方法: {}.{}", signature.getDeclaringTypeName(), name);
 | 
			
		||||
        LOG.info("远程地址: {}", request.getRemoteAddr());
 | 
			
		||||
 | 
			
		||||
        // 打印请求参数
 | 
			
		||||
        Object[] args = joinPoint.getArgs();
 | 
			
		||||
        // LOG.info("请求参数: {}", JSONObject.toJSONString(args));
 | 
			
		||||
 | 
			
		||||
        // 排除特殊类型的参数,如文件类型
 | 
			
		||||
        Object[] arguments = new Object[args.length];
 | 
			
		||||
        for (int i = 0; i < args.length; i++) {
 | 
			
		||||
            if (args[i] instanceof ServletRequest || args[i] instanceof ServletResponse || args[i] instanceof MultipartFile) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            arguments[i] = args[i];
 | 
			
		||||
        }
 | 
			
		||||
        // 排除字段,敏感字段或太长的字段不显示:身份证、手机号、邮箱、密码等
 | 
			
		||||
        String[] excludeProperties = {};
 | 
			
		||||
        PropertyPreFilters filters = new PropertyPreFilters();
 | 
			
		||||
        PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();
 | 
			
		||||
        excludefilter.addExcludes(excludeProperties);
 | 
			
		||||
        LOG.info("请求参数: {}", JSONObject.toJSONString(arguments, excludefilter));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Around("controllerPointcut()")
 | 
			
		||||
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
 | 
			
		||||
        long startTime = System.currentTimeMillis();
 | 
			
		||||
        Object result = proceedingJoinPoint.proceed();
 | 
			
		||||
        // 排除字段,敏感字段或太长的字段不显示:身份证、手机号、邮箱、密码等
 | 
			
		||||
        String[] excludeProperties = {};
 | 
			
		||||
        PropertyPreFilters filters = new PropertyPreFilters();
 | 
			
		||||
        PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();
 | 
			
		||||
        excludefilter.addExcludes(excludeProperties);
 | 
			
		||||
        LOG.info("返回结果: {}", JSONObject.toJSONString(result, excludefilter));
 | 
			
		||||
        LOG.info("------------- 结束 耗时:{} ms -------------", System.currentTimeMillis() - startTime);
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user