• springboot --AopLog


    在项目 pom.xml 文件中添加依赖:

    <!-- aop 依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    
    <!-- 用于日志切面中,以 json 格式打印出入参 -->
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.5</version>
    </dependency>

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    import com.google.common.primitives.Bytes;
    import lombok.extern.slf4j.Slf4j;
    import org.aopalliance.intercept.Joinpoint;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.EnableAspectJAutoProxy;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestAttributes;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    
    @Aspect
    @Component
    @EnableAspectJAutoProxy
    @Slf4j
    public class LogAop {
        // @Pointcut("@annotation(ExtendPoint)")     //ExtendPoint为自定义的注解
        @Pointcut("execution(* com.demo.wode.controller.*Controller.*(..))")   //表示controller目录下的所有类名包含Controller的类中所有的公有方法 
        public void excudeService() {
        }
    
        @Around("excudeService()")
        public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
            RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
            ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
            HttpServletRequest request = servletRequestAttributes.getRequest();
            log.info("=======================aop log start====================================");
    
            Object[] args = joinPoint.getArgs();
            List<Object> logArgs = Arrays.asList(args).stream()
                    .filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse)))
                    .collect(Collectors.toList());
    
            log.info("======request begin=====");
            log.info("url : {} ", request.getRequestURL());
            log.info("uri : {} ", request.getRequestURI());
            log.info("method : {} ", request.getMethod());
            log.info("param : {} ", JSON.toJSONString(logArgs));
    
            Object result;
            try {
                result = joinPoint.proceed();
                log.info("=====request end=====");
                log.info("result : {}", JSON.toJSONString(result));
            } catch (Exception e) {
                StackTraceElement[] stackTraceElements = e.getStackTrace();
                byte[] bytes = new byte[]{};
                for (StackTraceElement element : stackTraceElements) {
                    byte[] byteArray = element.toString().getBytes();
                    bytes = Bytes.concat(bytes, byteArray);
                }
                bytes = Bytes.concat(("*exception*" + e.getMessage() + "*exception*").getBytes(), bytes);
                e.printStackTrace();
                log.info("=======================aop log end with exception====================================");
                throw e;
            }
            log.info("=======================aop log end====================================");
    
            return result;
        }
    
    }
    
    
    
    第二种:
    package com.gaoxi.handle;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.context.request.RequestAttributes;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletRequest;
    
    /**
     * @Author 大闲人柴毛毛
     * @Date 2017/10/29 下午12:58
     * REST接口统一的日志处理
     */
    @ControllerAdvice
    @ResponseBody
    public class LogHandle {
    
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
        @Pointcut("execution(public * com.gaoxi.controller..*.*(..))")
        public void restLog(){}
    
        @Around("restLog()")
        public void doAround(ProceedingJoinPoint joinPoint) throws Throwable {
    
            // 生成本次请求时间戳
            String timestamp = System.currentTimeMillis()+"";
    
            RequestAttributes ra = RequestContextHolder.getRequestAttributes();
            ServletRequestAttributes sra = (ServletRequestAttributes) ra;
            HttpServletRequest request = sra.getRequest();
    
            String url = request.getRequestURL().toString();
            String method = request.getMethod();
            String uri = request.getRequestURI();
            String queryString = request.getQueryString();
            logger.info(timestamp + ", url: {}, method: {}, uri: {}, params: {}", url, method, uri, queryString);
    
            // result的值就是被拦截方法的返回值
            Object result = joinPoint.proceed();
            logger.info(timestamp + " , " + result.toString());
        }
    
    }
    
    
    
  • 相关阅读:
    设计模式之适配器模式温故知新(九)
    设计模式之策略模式总结(八)
    设计模式之观察者模式, 个人感觉相当的重要(七)
    设计模式之抽象工厂模式读后(六)
    设计模式之工厂模式详细读后感TT!(五)
    设计模式之简单工厂模式, 加速(四)
    设计模式之代理模式笔记(三)
    设计模式之单例模式读后思考(二)
    为什么要用设计模式?先看看6大原则(一)
    Codeforces_835
  • 原文地址:https://www.cnblogs.com/leeego-123/p/11274671.html
Copyright © 2020-2023  润新知