-
背景介绍
由于实际项目内网开发,项目保密,因此本文以笔者自己搭建的demo做演示,方便大家理解。
在项目开发过程中,团队成员为了方便调试,经常会在方法的出口和入口处加上log输出,由于每个人的log需求和输出方式不一样,在测试环境还好,但是上线后导致项目的日志输出特别的杂乱,有时候想要根据日志排查问题就特别地费劲。下面demo是项目中典型的日志输出方式
对于上面的日志打印位置和输出,其实是特别随意不规范的
- 例如controller层和service层都对请求的入参进行了打印,输出没有什么明显的改变,这个一般可以只保留一个
- 日志的整个请求缺少链路追踪,如果多个请求过来都打印分不清哪个是哪个
鉴于存在以上的不足,笔者痛下决心决定对日志打印进行改造。
-
架构思路
由于笔者的项目是微服务集群架构,但是单个服务是遵循MVC分层架构的,如下图所示:
鉴于这样的分层结构,笔者决定从controller层下手,使用spring AOP封装统一的入参和出参日志打印,以规范和解决项目中日志输出的乱象。
-
Spring AOP 核心概念
开始撸代码之前先简单回顾下Spring AOP的相关知识点
1、切面(aspect):切面就是对横切关注点的抽象,被@Aspect标记的类
2、横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。
3、连接点(joinpoint):被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring
中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。
4、切入点(pointcut):对连接点进行拦截的定义,可以是切点表达式,也可以是注解
5、通知(advice):所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类。
6、目标对象:代理的目标对象
7、织入(weave):将切面应用到目标对象并导致代理对象创建的过程
我们编码比较关注的就是 切