当系统出现bug时,很多时候难以重现当时的场景,我们又不知道在哪里出现了bug,这时,我们就需要一个异常时日志记录的功能。
通过AOP实现该功能
//切面类
@Aspect
@Component
public class ControllerLogAspect {
private final static Logger logger = LoggerFactory.getLogger(ControllerLogAspect.class);
//切入点表达式
@Pointcut("execution(public * com.example.rediss.controller..*.*(..))")
public void log() {
}
@Before("log()")
public void doBefore(JoinPoint joinPoint) {
logger.info("aop doBefore..");
}
@After("log()")
public void doAfter() {
logger.info("aop doAfter");
}
@AfterReturning(value = "log()")
public void afterReturning()
{
System.out.println("aop @AfterReturning");
}
@AfterThrowing("log()")
public void throwAfter() {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
Enumeration<String> paramter = request.getParameterNames();
logger.info("aop erroe,info");
}
@Around(value = "log()")
public Object myAround(ProceedingJoinPoint proceedingJoinPoint)
{
Object[] args = proceedingJoinPoint.getArgs();
Object result=null;
try {
//前置通知@Before
System.out.println("环绕前置通知");
//目标方法执行
result = proceedingJoinPoint.proceed(args);
//环绕返回通知@AfterReturning
System.out.println("环绕返回通知");
} catch (Throwable throwable) {
//环绕异常通知@AfterThrowing
System.out.println("环绕异常通知");
throw new RuntimeException(throwable);
} finally {
//最终通知@After
System.out.println("环绕最终通知");
}
return result;
}
}
1.使用不同spring版本,执行顺序会不同
2.如果目标任务出现异常,可直接在@AfterThrow里面记录参数,并写入日志