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

  • 本文基础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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/liuxiaofu/p/12005798.html

时间: 2024-10-28 21:36:15

SpringBoot使用AOP记录请求日志和异常日志的相关文章

ASP.NET Web API 记录请求响应数据到日志的一个方法

原文:http://blog.bossma.cn/dotnet/asp-net-web-api-log-request-response/ ASP.NET Web API 记录请求响应数据到日志的一个方法 REST风格的服务架构已经成为越来越多人的选择,之前我用过WCF来实现REST服务,WCF是一个很强大的框架,干这点小事有点太沉重的感觉.后来微软又推出了一个ASP.NET Web API,专门用来处理一些基本的Http服务,即灵活又简单,推荐大家都看看. 今天这篇文章是使用ASP.NET W

SpringBoot ------ 使用AOP处理请求

一.AOP统一处理请求日志 1.spring的两大核心:AOP ,  IOC 2.面向对象OOP关注的是将需求功能垂直,划分为不同的,并且相对独立的,   会封装成良好的类,并且类有属于自己的行为. 3.AOP则利用的是一种横切的技术,将面向对象构建的强大的类的体系,进行水平的切割:  并且将那些会影响到多个类的公共行为封装成一个可重用的模块.这个模块称为切面. 4.AOP的关键思想就是:将通用逻辑从业务逻辑中分离出来. 5.结合处理请求打印日志这两种需求来观察这两种思想怎么从垂直和水平来划分的

SpringBoot使用AOP获取请求参数

package com.*.aop; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; impo

c#实现把异常写入日志示例(异常日志)

将异常写到日志文件中,可以在调试程序的时候知道程序发生过哪些异常,并且可以知道异常发生的位置.这点对需要进行长时间运行并调试的程序尤为有效. 1 /// <summary> 2 /// 将异常打印到LOG文件 3 /// </summary> 4 /// <param name="ex">异常</param> 5 /// <param name="LogAddress">日志文件地址</param&g

springboot+aop切点记录请求和响应信息

本篇主要分享的是springboot中结合aop方式来记录请求参数和响应的数据信息:这里主要讲解两种切入点方式,一种方法切入,一种注解切入:首先创建个springboot测试工程并通过maven添加如下依赖: 复制代码 org.springframework.boot spring-boot-starter-aop com.alibaba fastjson 1.2.44 复制代码 先来说方法的切点方式,需要创建个名为LogAspect的组件类,然后用@Aspect注解修饰组件类,再通过设置方法切

SpringBoot应用中使用AOP记录接口访问日志

SpringBoot应用中使用AOP记录接口访问日志 本文主要讲述AOP在mall项目中的应用,通过在controller层建一个切面来实现接口访问的统一日志记录. AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. AOP的相关术语 通知(Advice) 通知

Spring + Aop+注解 集成使用 Log4j,实现异常日志记录

A,首先说,如何配置: 1,在web.xml中添加代码: <!-- log4j的配置相关 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:config/log4j/log4j.properties</param-value> </context-param> <context-param&g

springboot整合aop实现网站访问日志记录

目的: 统一日志输出格式,统计访问网站的ip. 思路: 1.针对不同的调用场景定义不同的注解,目前想的是接口层和服务层. 2.我设想的接口层和服务层的区别在于: (1)接口层可以打印客户端IP,而服务层不需要 (2)接口层的异常需要统一处理并返回,而服务层的异常只需要向上抛出即可 3.就像Spring中的@Controller.@Service.@Repository注解那样,虽然作用是一样的,但是不同的注解用在不同的地方显得很清晰,层次感一下就出来了 4.AOP去拦截特定注解的方法调用 5.为

SpringBoot使用AOP统一处理Web请求日志

<!--aop依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> @Aspect @Component public class WebLogAspect { private static final Logger logge