当前位置: 首页 > news >正文

spring-boot切面编程-日志记录

为什么80%的码农都做不了架构师?>>>   hot3.png

在开发过程经常需要进行对于入参,出参以及调用的路径等等做个打印记录,现在要说的是用切面做个日志的打印输出。

  • 引入依赖
    <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
  • 接下来就是写切面类(我这里日志引入了lombok,可以改成自己的日志打印LOGGER)
    import lombok.extern.slf4j.Slf4j;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    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;
    
    /**
     * web日志打印
     */
    @Aspect
    @Component
    @Slf4j
    public class WebLogAspect {
        /**
         * 两个..代表所有子目录,最后括号里的两个..代表所有参数
         * com.luoy.test 换成自己的包路径
         */
        @Pointcut("execution( * com.luoy.test..controller.*.*(..))")
        public void logPointCut() {
        }
    
        /**
         * 执行前操作
         * @param joinPoint
         */
        @Before("logPointCut()")
        public void doBefore(JoinPoint joinPoint){
            // 接收到请求,记录请求内容
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            // 记录下请求内容
            log.info("请求地址 : " + request.getRequestURL().toString());
            log.info("HTTP METHOD : " + request.getMethod());
            log.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "."
                    + joinPoint.getSignature().getName());
            log.info("参数 : " + Arrays.toString(joinPoint.getArgs()));
        }
    
        /**
         * 执行后打印日志
         * returning的值和doAfterReturning的参数名一致
         * @param ret
         */
        @AfterReturning(returning = "ret", pointcut = "logPointCut()")
        public void doAfterReturning(Object ret) {
            // 处理完请求,返回内容(返回值太复杂时,打印的是物理存储空间的地址)
            log.info("返回值 : " + ret);
        }
    
        /**
         * 环绕通知做打印耗时
         * 也可以把上面的2个合到这里来
         * @param pjp
         * @return
         * @throws Throwable
         */
        @Around("logPointCut()")
        public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
            long startTime = System.currentTimeMillis();
            // ob 为方法的返回值
            Object ob = pjp.proceed();
            log.info("耗时 : " + (System.currentTimeMillis() - startTime));
            return ob;
        }
    }
    
  • 写个测试类测试下
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/test")
    public class TestController {
    
        @RequestMapping(value = "/test")
        public String test(String name) {
            return "hello" + name;
        }
    }
  • 输入地址localhost:port/test/test?name=luoye
    请求地址 : http://localhost:7082/test/test
    HTTP METHOD : GET
    CLASS_METHOD : com.luoy.test.controller.TestController.test
    参数 : [luoy]
    耗时 : 0
    返回值 : helloluoy
  • 这样就简单方便多了

 

转载于:https://my.oschina.net/xpx/blog/2995995

相关文章:

  • 从0到1学C++ 第2篇 认识C++面向过程编程的特点
  • Java01
  • 苹果下调财收预期,致使股价大跌近10%,万亿身家缩水近一半
  • 图像的等距变换,相似变换,仿射变换,射影变换
  • 解决NoclassDefFoundError 打印一个类的java路径
  • 从Lucene到Elasticsearch:从 Lucene 到 ElasticSearch
  • 【文文殿下】ExBSGS
  • [HNOI2008]Cards
  • Facebook 2018 年度开源回顾:新增开源项目 153 个
  • 游戏开发中的抛物线(贝塞尔曲线)
  • Vue UI框架库开发介绍
  • MultipartFile 不能直接 转成File对象
  • react native 包学不包会系列--react native开发基础知识
  • 老鼠的商议
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .pyc 想到的一些问题
  • [数据结构]链表的实现在PHP中
  • ComponentOne 2017 V2版本正式发布
  • CSS盒模型深入
  • git 常用命令
  • java8 Stream Pipelines 浅析
  • MySQL-事务管理(基础)
  • python 学习笔记 - Queue Pipes,进程间通讯
  • React Native移动开发实战-3-实现页面间的数据传递
  • text-decoration与color属性
  • webpack+react项目初体验——记录我的webpack环境配置
  • Yii源码解读-服务定位器(Service Locator)
  • 从PHP迁移至Golang - 基础篇
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 模型微调
  • 配置 PM2 实现代码自动发布
  • 前端面试之闭包
  • 使用API自动生成工具优化前端工作流
  • 使用权重正则化较少模型过拟合
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 交换综合实验一
  • (¥1011)-(一千零一拾一元整)输出
  • (C语言)逆序输出字符串
  • (九)One-Wire总线-DS18B20
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (三)elasticsearch 源码之启动流程分析
  • (算法)N皇后问题
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)菜鸟学数据库(三)——存储过程
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET HttpWebRequest、WebClient、HttpClient
  • .Net 知识杂记
  • .net开发引用程序集提示没有强名称的解决办法
  • /proc/vmstat 详解
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [AIGC] 开源流程引擎哪个好,如何选型?
  • [Android]使用Git将项目提交到GitHub