Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 361|回复: 0

SpringBoot使用AOP记录请求日志和异常日志

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 789 天

    [LV.10]以坛为家III

    2049

    主题

    2107

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    722638
    发表于 2021-7-4 10:45:36 | 显示全部楼层 |阅读模式
    • 本文基础WEB环境使用SpringBoot及Spring-Data-Jpa构建
    • 关于SpringBoot及JPA用法本文不再过多讨论,下面是引入的jar:


       
      起步依赖

       
      web及aop依赖

       
      jpa依赖

       
      mysql驱动
    • 本文着重AOP的使用,你也可以使用自己构建的环境
    1. 由于本文中使用的JPA,因此首先创建保存日志及保存异常的实体类,如果你使用的是Mybatis,则需要首先创建表然后根据表来逆向生成实体类
    • 保存日志的实体类:


       
      日志实体
    • 保存异常的实体类:


       
      异常实体

    1. 接下来我们定义一个Operation注解,用于声明在方法上描述此方法执行了什么操作:


       
      操作注解
    • @Target 声明这是一个自定义注解类,ElementType.METHOD 表明此注解可声明在方法上
    • @Retention 声明注解保留期限,RetentionPolicy.RUNTIME 表明此注解可保留至运行时,可以通过反射获取注解信息

    1. 然后编写一个AOP切面类,由于使用的SpringBoot只要保证在Application子目录之下就被会自动扫描,所以只需要注解声明即可,并不需要额外配置


       
      请求切面
    • @Aspect 声明这是一个切面类
    • @Compoent 此类交由Spring容器管理

    1. 定义请求日志切入点:


       
      切入点
    • @PointCut 定义请求日志切入点,其切入点表达式有多种匹配方式,详细请自行参阅资料,此处切入点为所有声明@Operation注解的方法

    1. 编写方法的前置通知:


       
      前置通知
    • 前置通知在执行目标方法之前执行
    • 在前置通知中设置请求日志信息,如开始时间,请求参数,注解内容等

    1. 编写方法的返回通知:


       
      返回通知
    • 返回通知,在目标方法正常结束之后执行
    • 在返回通知中补充请求日志信息,如返回时间,方法耗时,返回值,并且保存日志信息

    1. 编写方法的异常通知:


       
      异常通知
    • 异常通知,在目标方法非正常结束,发生异常或者抛出异常时执行
    • 在异常通知中设置异常信息,并将其保存

    1. Spring AOP 共计五种通知,由于本文中只需要三种,其它两种只做简单介绍,如有兴趣请自行查阅资料
    • 后置通知:在目标方法执行之后执行,与返回通知不同的是此通知无法拿到返回值,并且不管是否发生异常都会执行
    • 环绕通知:围绕动态代理的全过程,需要携带ProceedingJoinPoint参数,并且必须有返回值,且ProceedingJoinPoint类型的参数可以决定是否执行目标方法

    1. 在前置通知中设置请求日志信息的工具类:
    • 获取请求IP


       
      获取请求IP
    • 获取请求方式


       
      获取请求方式
    • 获取切入点的参数信息


       
      获取切入点的参数信息

       
      获取切入点的参数信息

    1. 编写一个简易Controoler,用于测试请求日志记录:


       
      测试请求日志
    • 启动SpringBoot之后,访问测试请求日志的URL,查看请求日志表记录,可以看到日志已成功记录:


       
      请求成功

       
      请求日志表记录
    • 接下来把测试请求日志的Controoler修改为抛出一个异常,测试异常记录:

     
    测试异常日志
    • 然后重新启动SpringBoot,再次访问刚才的URL,可以看到产生了异常:


       
      请求异常
    • 再次查看请求日志表,发现还是一条记录,说明异常通知执行后并不会执行返回通知,这正是我们期望的结果:


       
      请求日志记录
    • 然后我们再查看异常记录表,发现已经将异常记录:


       
      异常日志

    至此,SpringBoot AOP记录请求日志和异常日志完成



    作者:陪你一起debug
    链接:https://www.jianshu.com/p/d8a654993719
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-9-10 12:17 , Processed in 0.063346 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表