springboot配置aop切⾯⽇志打印过程解析
这篇⽂章主要介绍了springboot配置aop切⾯⽇志打印过程解析,⽂中通过⽰例代码介绍的⾮常详细,对⼤家的学习或者⼯作具有⼀定的参考学习价值,需要的朋友可以参考下
⼀、SpringBoot Aop说明
1. Aop
AOP(Aspect-Oriented Programming,⾯向切⾯编程),它利⽤⼀种”横切”的技术,将那些多个类的共同⾏为封装到⼀个可重⽤的模块。便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
2. AOP相关概念:
Aspect(切⾯):声明类似于Java中的类声明,在Aspect中会包含⼀些Pointcut及相应的Advice。
Joint point(连接点):表⽰在程序中明确定义的点。包括⽅法的调⽤、对类成员的访问等。
Pointcut(切⼊点):表⽰⼀个组Joint point,如⽅法名、参数类型、返回类型等等。
Advice(通知):Advice定义了在Pointcut⾥⾯定义的程序点具体要做的操作,它通过(before、around、after(return、throw)、finally来区别实在每个Joint point之前、之后还是执⾏前后要调⽤的代码。
Before:在执⾏⽅法前调⽤Advice,⽐如请求接⼝之前的登录验证。
Around:在执⾏⽅法前后调⽤Advice,这是最常⽤的⽅法。
After:在执⾏⽅法后调⽤Advice,after、return是⽅法正常返回后调⽤,after\throw是⽅法抛出异常后调⽤。
Finally:⽅法调⽤后执⾏Advice,⽆论是否抛出异常还是正常返回。
AOP proxy:AOP proxy也是Java对象,是由AOP框架创建,⽤来完成上述动作,AOP对象通常可以通过JDK dynamic proxy完成,或者使⽤CGLIb完成。
Weaving:实现上述切⾯编程的代码织⼊,可以在编译时刻,也可以在运⾏时刻,Spring和其它⼤多数Java框架都是在运⾏时刻⽣成代理。
⼆、代码⽰例
1. POM引⼊
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- 分析客户端信息的⼯具类-->
<dependency>
<groupId>eu.bitwalker</groupId>
<artifactId>UserAgentUtils</artifactId>
<version>1.21</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>1.18.10</scope>
</dependency>
</dependencies>
2、切⾯:WebLogAspect代码
/**
* 添加aop⽇志打印
*
* @author 马振全 2020/1/13 14:42
*/
@Aspect
@Component
@Slf4j
public class WebLogAspect {
/
**
* 进⼊⽅法时间戳
private Long startTime;
/**
* ⽅法结束时间戳(计时)
*/
private Long endTime;
public WebLogAspect() {
springboot aop}
/**
* 定义请求⽇志切⼊点,其切⼊点表达式有多种匹配⽅式,这⾥是指定路径
*/
@Pointcut("execution(public * com.ller.*.*(..))")
public void webLogPointcut() {
}
/**
* 前置通知:
* 1. 在执⾏⽬标⽅法之前执⾏,⽐如请求接⼝之前的登录验证;
* 2. 在前置通知中设置请求⽇志信息,如开始时间,请求参数,注解内容等
*
* @param joinPoint
* @throws Throwable
*/
@Before("webLogPointcut()")
public void doBefore(JoinPoint joinPoint) {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestAttributes();
HttpServletRequest request = Request();
//获取请求头中的User-Agent
UserAgent userAgent = UserAgent.Header("User-Agent"));
//打印请求的内容
startTime = System.currentTimeMillis();
log.info("请求开始时间:{}", w());
log.info("请求Url : {}", RequestURL().toString());
log.info("请求⽅式 : {}", Method());
log.info("请求ip : {}", RemoteAddr());
log.info("请求⽅法 : ", Signature().getDeclaringTypeName() + "." + Signature().getName());    log.info("请求参数 : {}", Args()));
// 系统信息
log.info("浏览器:{}", Browser().toString());
log.info("浏览器版本:{}", BrowserVersion());
log.info("操作系统: {}", OperatingSystem().toString());
}
/**
* 返回通知:
* 1. 在⽬标⽅法正常结束之后执⾏
* 1. 在返回通知中补充请求⽇志信息,如返回时间,⽅法耗时,返回值,并且保存⽇志信息
*
* @param ret
* @throws Throwable
*/
@AfterReturning(returning = "ret", pointcut = "webLogPointcut()")
public void doAfterReturning(Object ret) throws Throwable {
endTime = System.currentTimeMillis();
log.info("请求结束时间:{}", w());
log.info("请求耗时:{}", (endTime - startTime));
/
/ 处理完请求,返回内容
log.info("请求返回 : {}", ret);
}
/**
* 异常通知:
* 1. 在⽬标⽅法⾮正常结束,发⽣异常或者抛出异常时执⾏
* 1. 在异常通知中设置异常信息,并将其保存
*
* @param throwable
*/
@AfterThrowing(value = "webLogPointcut()", throwing = "throwable")
public void doAfterThrowing(Throwable throwable) {
// 保存异常⽇志记录
<("发⽣异常时间:{}", w());
<("抛出异常:{}", Message());
}
}
3、@Before和@AfterReturning部分也可使⽤以下代码替代
* 在执⾏⽅法前后调⽤Advice,这是最常⽤的⽅法,相当于@Before和@AfterReturning全部做的事⼉
* @param pjp
* @return
* @throws Throwable
*/
@Around("webLogPointcut()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestAttributes();
HttpServletRequest request = Request();
//获取请求头中的User-Agent
UserAgent userAgent = UserAgent.Header("User-Agent"));
//打印请求的内容
startTime = System.currentTimeMillis();
log.info("请求Url : {}" , RequestURL().toString());
log.info("请求⽅式 : {}" , Method());
log.info("请求ip : {}" , RemoteAddr());
log.info("请求⽅法 : " , Signature().getDeclaringTypeName() , "." , Signature().getName());
log.info("请求参数 : {}" , Args()));
// 系统信息
log.info("浏览器:{}", Browser().toString());
log.info("浏览器版本:{}",BrowserVersion());
log.info("操作系统: {}", OperatingSystem().toString());
// pjp.proceed():当我们执⾏完切⾯代码之后,还有继续处理业务相关的代码。proceed()⽅法会继续执⾏业务代码,并且其返回值,就是业务处理完成之后的返回值。  Object ret = pjp.proceed();
log.info("请求结束时间:"+ w());
log.info("请求耗时:{}" , (System.currentTimeMillis() - startTime));
// 处理完请求,返回内容
log.info("请求返回 : " , ret);
return ret;
}
4、测试结果
2020-01-13 15:18:21.309 INFO xxx.WebLogAspect : 请求开始时间:2020-01-13T15:18:21.309
2020-01-13 15:18:21.309 INFO xxx.WebLogAspect : 请求Url : localhost:8020/api/v1/hourlyStat/findHourlyStatReportList
2020-01-13 15:18:21.320 INFO xxx.WebLogAspect : 请求⽅式 : POST
2020-01-13 15:18:21.321 INFO xxx.WebLogAspect : 请求ip : 0:0:0:0:0:0:0:1
2020-01-13 15:18:21.322 INFO xxx.WebLogAspect : 请求⽅法 :
2020-01-13 15:18:21.325 INFO xxx.WebLogAspect : 请求参数 : [HourlyStat{subStrategyId=null}]
2020-01-13 15:18:21.326 INFO xxx.WebLogAspect : 浏览器:CHROME
2020-01-13 15:18:21.327 INFO xxx.WebLogAspect : 浏览器版本:78.0.3904.108
2020-01-13 15:18:21.333 INFO xxx.WebLogAspect : 操作系统: WINDOWS_10
2020-01-13 15:18:21.403 INFO xxx.WebLogAspect : 请求结束时间:2020-01-13T15:18:21.403
2020-01-13 15:18:21.405 INFO xxx.WebLogAspect : 请求耗时:94
2020-01-13 15:18:21.405 INFO xxx.WebLogAspect : 请求返回 : com.inemon.Result@2f935d03
2020-01-13 15:18:21.492 INFO xxx.WebLogAspect : 请求结束时间:2020-01-13T15:18:21.492
2020-01-13 15:18:21.493 INFO xxx.WebLogAspect : 请求耗时:183
2020-01-13 15:18:21.494 INFO xxx.WebLogAspect : 请求返回 : com.inemon.Result@7199e922
2020-01-13 15:18:42.859 INFO xxx.WebLogAspect : 请求开始时间:2020-01-13T15:18:42.859
2020-01-13 15:18:42.860 INFO xxx.WebLogAspect : 请求Url : localhost:8020/api/v1/hourlyStat/findHourlyStatReportList
2020-01-13 15:18:42.860 INFO xxx.WebLogAspect : 请求⽅式 : POST
2020-01-13 15:18:42.861 INFO xxx.WebLogAspect : 请求ip : 0:0:0:0:0:0:0:1
2020-01-13 15:18:42.861 INFO xxx.WebLogAspect : 请求⽅法 :
2020-01-13 15:18:42.862 INFO xxx.WebLogAspect : 请求参数 : [HourlyStat{subStrategyId=1003}]
2020-01-13 15:18:42.862 INFO xxx.WebLogAspect : 浏览器:CHROME
2020-01-13 15:18:42.863 INFO xxx.WebLogAspect : 浏览器版本:78.0.3904.108
2020-01-13 15:18:42.864 INFO xxx.WebLogAspect : 操作系统: WINDOWS_10
2020-01-13 15:18:42.909 INFO xxx.WebLogAspect : 请求结束时间:2020-01-13T15:18:42.909
2020-01-13 15:18:42.910 INFO xxx.WebLogAspect : 请求耗时:50
2020-01-13 15:18:42.910 INFO xxx.WebLogAspect : 请求返回 : com.inemon.Result@7d494cbd
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。