1.定义注解
- /**
- * 系统日志元注解
- */
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface LogFilter {
- String value() default "" ;
- }
2.编写切面的实现
- @Aspect
- @Component
- public class LogAspect {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(LogAspect.class) ;
-
- //切入点,已经被增强的连接点。
- @Pointcut("@annotation(com.boot.aop.config.LogFilter)")
- public void logPointCut (){
-
- }
- //通知增强代码
- @Around("logPointCut()")
- public Object around (ProceedingJoinPoint point) throws Throwable {
- Object result = null ;
- try{
- // 执行方法
- result = point.proceed();
-
- // 保存请求日志
- saveRequestLog(point);
-
- } catch (Exception e){
- // 保存异常日志
- saveExceptionLog(point,e.getMessage());
- }
- return result;
- }
-
-
-
- /**
- * 捕获异常:/ by zero
- * 请求路径:http://localhost:8011/saveExceptionLog
- * 请求方法:saveExceptionLog
- * 模块描述:保存异常日志
- * 请求参数:["cicada"]
- */
- private void saveExceptionLog (ProceedingJoinPoint point,String exeMsg){
- LOGGER.info("捕获异常:"+exeMsg);
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
- LOGGER.info("请求路径:"+request.getRequestURL());
- MethodSignature signature = (MethodSignature) point.getSignature();
- Method method = signature.getMethod();
- LOGGER.info("请求方法:"+method.getName());
- // 获取方法上LogFilter注解
- LogFilter logFilter = method.getAnnotation(LogFilter.class);
- String value = logFilter.value() ;
- LOGGER.info("模块描述:"+value);
- Object[] args = point.getArgs();
- LOGGER.info("请求参数:"+ JSONObject.toJSONString(args));
- }
-
- /**
- * 请求路径:http://localhost:8011/saveRequestLog
- * 请求方法:saveRequestLog
- * 模块描述:保存请求日志
- * 请求参数:["cicada"]
- */
- private void saveRequestLog (ProceedingJoinPoint point){
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
- LOGGER.info("请求路径:"+request.getRequestURL());
-
-
- MethodSignature signature = (MethodSignature) point.getSignature();
- Method method = signature.getMethod();
- LOGGER.info("请求方法:"+method.getName());
-
-
-
- // 获取方法上LogFilter注解
- LogFilter logFilter = method.getAnnotation(LogFilter.class);
- String value = logFilter.value() ;
- LOGGER.info("模块描述:"+value);
-
-
-
- Object[] args = point.getArgs();
- LOGGER.info("请求参数:"+ JSONObject.toJSONString(args));
- }
- }
3.测试
- @LogFilter("保存请求日志")
- @RequestMapping("/saveRequestLog")
- public String saveRequestLog (@RequestParam("name") String name){
- return "success:"+name ;
- }
-
- @LogFilter("保存异常日志")
- @RequestMapping("/saveExceptionLog")
- public String saveExceptionLog (@RequestParam("name") String name){
- int error = 100 / 0 ;
- System.out.println(error);
- return "success:"+name ;
- }
- }
