码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 通过AOP实现全局日志打印


    通过AOP实现全局日志打印

    1.@Before 前置增强(目标方法执行之前,执行注解标注的内容)

    2.@AfterReturning 后置增强(目标方法正常执行完毕后,执行)

    3.@Around 环绕增强(目标方法执行前后,分别执行一些代码)

    4.@AfterThrowing 抛出增强(目标方法发生异常,执行)

    5.@After Final增强(不管是抛出异常还是正常退出,该增强都会得到执行。一般用于释放资源,相当于try{}finally{})。
     

    切Controller打印请求的接口、参数、返回值以及耗时情况。

    package com.tfjy.arbackend.aop;
     
    import com.alibaba.fastjson.JSONObject;
    import com.tfjy.arbackend.util.FrontResult;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    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.springframework.stereotype.Component;
    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.ArrayList;
    import java.util.List;
     

    @Aspect
    @Component
    public class RestAopConfig {
        /**
         * 控制是否开启日志
         */
        public static Boolean onOff = false;
        private static Log logger = LogFactory.getLog(RestAopConfig.class);
     
        @Pointcut("execution(public * com.tfjybj.provider.controller..*.*(..))")
        public void pointCutRestDef(){
        }
     
        //环绕切点
        @Around("pointCutRestDef()")
        public Object processRst(ProceedingJoinPoint point) throws Throwable{
            Object returnValue = null;
            final List params = new ArrayList<>();
            //获得请求信息
            ServletRequestAttributes sra  =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            if(sra==null){
                return point.proceed();
            }
            HttpServletRequest request = sra.getRequest();
            Object[] args = point.getArgs();
            //过滤出HttpServlet
            for (int i = 0; i < args.length; i++) {
                Object object = args[i];
                if (object instanceof HttpServletResponse){
                    continue;
                }
                if (object instanceof HttpServletRequest){
                    continue;
                }
                params.add(object);
            }
     
     
            logger.info("--------------------请求开始---------------------------");
            logger.info("请求方法 rest method:——>"+ request.getMethod());
            logger.info("请求路径 rest route:——>"+point.getSignature().getDeclaringTypeName()+"."+point.getSignature().getName());
            String cloneParams = JSONObject.toJSONString(params);
            logger.info("请求参数 rest param:——>"+cloneParams);
            long startTime = System.currentTimeMillis();
            //去执行方法,这里的异常交给统一捕获异常去处理
            //出错之后,不在这里处理
            returnValue = point.proceed(point.getArgs());
     
            //处理返回值 计算时间
            long endTime = System.currentTimeMillis();
            logger.info("请求用时 rest Time:——>"+request.getRequestURI()+"----used time----"+(endTime - startTime)+"ms");
            Boolean boolean1 =true;
            if (returnValue != null && !returnValue.equals(boolean1)){
                logger.info("响应数据 rest Data:——>"+JSONObject.toJSONString(returnValue));
            }
            logger.info("-------------------请求结束---------------------------");
            return  returnValue;
     
        }
    }

    三、切Controller打印请求的接口、参数、返回值以及耗时情况。

    package com.tfjy.arbackend.aop;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    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 java.util.Arrays;

    @Aspect    //注解将一个java类定义为切面类
    @Component
    public class AopGetService {
        private static Log logger = LogFactory.getLog(AopGetService.class);
        /*使用@Pointcut定义一个切入点,可以是一个规则表达式,比如下例中某个package下的所有函数,也可以是一个注解等。
            根据需要在切入点不同位置的切入内容*/
        @Pointcut("execution(public * com.tfjy.arbackend.service..*.*(..))")//切入点描述 这个是service包的切入点
        public void getServiceJournal() {
        }//签名,可以理解成这个切入点的一个名称
        
        //前置切点
        @Before("getServiceJournal()")//在切入点开始处切入内容
        public void logBeforeService(JoinPoint joinPoint) {
            // 接收到请求,记录请求内容
            RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
            if(requestAttributes==null){
                 return ;
            }
            HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
            // 记录下请求内容
            logger.info("URL : " + request.getRequestURL().toString());
            logger.info("HTTP_METHOD : " + request.getMethod());
            logger.info("IP : " + request.getRemoteAddr());
            //下面这个getSignature().getDeclaringTypeName()是获取包+类名的   然后后面的joinPoint.getSignature.getName()获取了方法名
            logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
            logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));
        }
    }

  • 相关阅读:
    Maven 插件统一修改聚合工程项目版本号
    VTK OrientationMarker 方向 三维坐标系 相机坐标轴 自定义坐标轴
    MySQL数据库基础:JSON函数各类操作一文详解
    Leetcode82删除排序链表中重复元素2
    Unity shader time
    arm day 8
    SpringBoot中localeResolver使用教程
    【操作系统】十分钟了解关于TCP/IP网络的基础知识(二)ARP、路由器、DHCP、DNS以及TCP/IP
    springboot post添加URL添加参数
    Java入门实操复习心得(全)
  • 原文地址:https://blog.csdn.net/yanghezheng/article/details/126905431
    • 最新文章
    • 攻防演习之三天拿下官网站群
      数据安全治理学习——前期安全规划和安全管理体系建设
      企业安全 | 企业内一次钓鱼演练准备过程
      内网渗透测试 | Kerberos协议及其部分攻击手法
      0day的产生 | 不懂代码的"代码审计"
      安装scrcpy-client模块av模块异常,环境问题解决方案
      leetcode hot100【LeetCode 279. 完全平方数】java实现
      OpenWrt下安装Mosquitto
      AnatoMask论文汇总
      【AI日记】24.11.01 LangChain、openai api和github copilot
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
    正则表达式工具 cron表达式工具 密码生成工具

    京公网安备 11010502049817号