SpringBoot AOP如何实现30个Web请求日志统一处理?
- 内容介绍
- 文章标签
- 相关推荐
本文共计733个文字,预计阅读时间需要3分钟。
说明:在此处使用的日志框架是slf4j结合log4j2,具体的使用方式可以参考以下内容:
《SpringBoot入门三,添加log4j2支持》
与《SpringBoot配置多环境log4j2》
如果使用其他日志组件,通常配置如下:
说明:
日志我这里使用的是slf4j+log4j2,具体的使用方式可以参考《SpringBoot入门三,添加log4j2支持》与《SpringBoot配置多环境log4j2》;如果是使用其他日志组件,正常配置即可.
1.pom.xml添加引用
因为需要对web请求做切面来记录日志,所以需要入AOP模块
<!-- 引入aop切面支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.添加日志切面类
import java.util.Arrays;
import javax.servlet.localhost/test/helloTwo/张三?age=16
localhost/test/hello?userName=李四&age=17
localhost/test2/eat?foodName=面包
5.2 异常请求
localhost/test2/calc?a=10&b=0
6.扩展知识
6.1 execution(切点函数)
除了返回类型模式、方法名模式和参数模式,其它项都是可选的.语法结构:
execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)
整个表达式可以分为五个部分:
1.execution():表达式主体.
2.第一个*号:表示返回类型,*号表示所有的类型.
3.包名:表示需要拦截的包名
4.第二个*号:表示类名, .*号表示当前包所有的类; ..*表示当前包及所有子包的所有的类
5.*(..) :第三个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数.
表达式
说明
execution(public * *(..))
匹配所有目标类的public方法.
第一个*代表返回类型,
第二个*代表方法名,
..代表任意入参的方法
execution(* *Add(..))
匹配目标类所有以Add为结尾的方法.第一个*代表返回类型,
*Add代表任意以Add为结尾的方法
execution(* com.qfx..*(..))
匹配com.qfx包及子孙包所有类所有方法
execution(* com.qfx.*.*(..))
匹配com.qfx包所有类所有方法
execution(* com.qfx.RoleSerImpl.*(..))
匹配com.qfx包RoleSerImpl类所有方法
execution(* com.qfx..*.Dao.find(..))
匹配com.qfx包下类名后缀为Dao,且方法名以find为前缀的方法
execution(* com.qfx.UserSer+.*(..))
匹配com.qfx包下实现UserSer接口的所有类的所有方法
execution(* info(String, int))
匹配info方法中,第一个参数是String,第二个int的方法
execution(* info(String, *)))
匹配info方法中,第一个参数是String,第二个任意类型
execution(* info(String, ..)))
匹配info方法中,第一个参数是String,后面任意参数
execution(* info(Object+)))
匹配info方法中,方法拥有一个入参,且入参是Object类型或该类的子类
本文共计733个文字,预计阅读时间需要3分钟。
说明:在此处使用的日志框架是slf4j结合log4j2,具体的使用方式可以参考以下内容:
《SpringBoot入门三,添加log4j2支持》
与《SpringBoot配置多环境log4j2》
如果使用其他日志组件,通常配置如下:
说明:
日志我这里使用的是slf4j+log4j2,具体的使用方式可以参考《SpringBoot入门三,添加log4j2支持》与《SpringBoot配置多环境log4j2》;如果是使用其他日志组件,正常配置即可.
1.pom.xml添加引用
因为需要对web请求做切面来记录日志,所以需要入AOP模块
<!-- 引入aop切面支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.添加日志切面类
import java.util.Arrays;
import javax.servlet.localhost/test/helloTwo/张三?age=16
localhost/test/hello?userName=李四&age=17
localhost/test2/eat?foodName=面包
5.2 异常请求
localhost/test2/calc?a=10&b=0
6.扩展知识
6.1 execution(切点函数)
除了返回类型模式、方法名模式和参数模式,其它项都是可选的.语法结构:
execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)
整个表达式可以分为五个部分:
1.execution():表达式主体.
2.第一个*号:表示返回类型,*号表示所有的类型.
3.包名:表示需要拦截的包名
4.第二个*号:表示类名, .*号表示当前包所有的类; ..*表示当前包及所有子包的所有的类
5.*(..) :第三个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数.
表达式
说明
execution(public * *(..))
匹配所有目标类的public方法.
第一个*代表返回类型,
第二个*代表方法名,
..代表任意入参的方法
execution(* *Add(..))
匹配目标类所有以Add为结尾的方法.第一个*代表返回类型,
*Add代表任意以Add为结尾的方法
execution(* com.qfx..*(..))
匹配com.qfx包及子孙包所有类所有方法
execution(* com.qfx.*.*(..))
匹配com.qfx包所有类所有方法
execution(* com.qfx.RoleSerImpl.*(..))
匹配com.qfx包RoleSerImpl类所有方法
execution(* com.qfx..*.Dao.find(..))
匹配com.qfx包下类名后缀为Dao,且方法名以find为前缀的方法
execution(* com.qfx.UserSer+.*(..))
匹配com.qfx包下实现UserSer接口的所有类的所有方法
execution(* info(String, int))
匹配info方法中,第一个参数是String,第二个int的方法
execution(* info(String, *)))
匹配info方法中,第一个参数是String,第二个任意类型
execution(* info(String, ..)))
匹配info方法中,第一个参数是String,后面任意参数
execution(* info(Object+)))
匹配info方法中,方法拥有一个入参,且入参是Object类型或该类的子类

