利用Aop拦截所有的Service方法,对执行结果日志进行记录。
package com.ats.dt.advice;
import com.ats.dt.exceptions.HandleException;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.CrossOrigin;
import java.util.Arrays;
/**
* 日志通知
* */
@Slf4j
@Aspect
@Component
@CrossOrigin
public class CommonLogAdvice {
/**
* 所有serviceClass的类的所有public方法
*/
@Pointcut("execution(public * com.wxl52d41..*ServiceImpl.*(..))")
public void serviceClass() {
}
// @Around("within(@org.springframework.stereotype.Service *)") //扫描所有@Service注解的下类中的所有的方法
@Around("serviceClass()") //扫描所有@Service注解的下类中的所有的方法
public Object handleExceptionLog(ProceedingJoinPoint jp) throws Throwable {
try {
// 记录方法进入日志,Signature包名+类名+方法名。Args方法的所有参数
log.debug("{}方法准备调用,参数: {}", jp.getSignature(), Arrays.toString(jp.getArgs()));
long a = System.currentTimeMillis();
// 调用切点方法(方法执行)
Object result = jp.proceed();
// 记录方法结束日志
log.debug("{}方法调用成功,执行耗时 {} ms", jp.getSignature(), System.currentTimeMillis() - a);
return result;
} catch (Throwable throwable) {
log.error("{}方法执行失败,原因:{}", jp.getSignature(), throwable.getMessage(), throwable);
// 判断异常是否是HandleException
if(throwable instanceof HandleException){
// 如果是,不处理,直接抛
throw throwable;
}else{
// 如果不是,转为HandleException
throw new HandleException(500, throwable);
}
}
}
}
切点表达式
2、依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
</dependency>
2.注意要开启debug日志模式,否则统一日志不生效
logging.level.com.ats.dt=debug
logging:
level:
XXX.XXX: debug
版权声明:本文为weixin_43811057原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。