当前位置: 首页 > 科技观察

在SpringBoot中使用SpringAop实现日志记录功能

时间:2023-03-17 01:35:17 科技观察

1.创建日志注解1.日志类型枚举类importlombok.Getter;/***日志类型枚举类*/@GetterpublicenumLogType{/***Login*/login("LoginLog");/***实现类名*/privatefinalStringimplClassName;LogType(StringimplClassName){this.implClassName=implClassName;}}2.自定义日志注解importjava.lang.annotation.*;importcom.baige.enums.LogType;/***自定义日志注解**注解说明:*@Documented:文档注解*@Retention(RetentionPolicy.RUNTIME):生命周期注解,注解不仅保存在class文件中,jvm加载class文件后依然存在*@Target({ElementType.PARAMETER,ElementType.METHOD}):@Target描述了Annotation修饰的对象范围,ElementType.TYPE:接口,类,枚举,注解,ElementType.METHOD:方法*/@Documented@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.PARAMETER,ElementType.METHOD})public@interfaceLog{/***登录类型*/LogTypelogType();}2.使用AOP实现日志方面的统一处理1.日志实现类创建Factoryimportcom.baige.enums.LogType;importcom.baige.util.SpringContextHolder;importorg.springframework.context.ApplicationContext;/***日志实现类创建工厂*/publiC类LogFactory{公共静态ApplicationContext上下文;publicstaticIUserLoggetInstance(LogTypelogType){return(IUserLog)SpringContextHolder.getBean(logType.getImplClassName());}}2.导入lombok.extern.slf4j.Slf4j;进口商品baige.aop.log.IUserLog;导入com.baige.aop.annotation.Log;导入com.baige.aop.log.LogFactory;导入org.aspectj.lang.annotation.*;导入org.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.reflect.MethodSignature;importorg.springframework.stereotype.Component;@Slf4j@Aspect@ComponentpublicclassLogAspect{/***定义入口,都在com.baige.controller.AopController函数中*通过@Pointcut注解声明常用的切入点表达式*/@Pointcut("execution(public*com.baige.controller.UserController.*(..)))")publicvoidpointcut(){}@Around("pointcut()")publicvoiddoAround(ProceedingJoinPointpjp){try{MethodSignaturemethodSignature=(MethodSignature)pjp.getSignature();日志log=methodSignature.getMethod().getAnnotation(Log.class);IUserLoguserLog=LogFactory.getInstance(log.logType());userLog.addLog(pjp,日志);}catch(Throwablethrowable){log.info("日志记录异常,不影响正常业务",throwable);}}}3.创建日志实现类1.添加日志接口*添加日志*/intaddLog(ProceedingJoinPointpjp,Loglog)throwsUnknownHostException;}2.添加日志接口实现类importjava.util.Date;importjava.net.InetAddress;导入java.net.UnknownHostException;导入lombok.AllArgsConstructor;导入org.aspectj.lang.ProceedingJoinPoint;导入org.springframework.stereotype.Component;导入com.baige.domain.User;导入com.baige.domain。UserLog;importcom.baige.aop.log.IUserLog;importcom.baige.mapper.UserMapper;importcom.baige.aop.annotation.Log;importcom.baige.mapper.UserLogMapper;@AllArgsConstructor@Component("LoginLog")publicclassLoginLogimplementsIUserLog{privatefinalUserMapperuserMapper;私有最终UserLogMapperuserLogMapper;@OverridepublicintaddLog(ProceedingJoinPointpjp,Loglog)throwsUnknownHostException{UserLoguserLog=newUserLog();对象[]参数=pjp.getArgs();if(params.length>0){用户参数=(用户)参数[0];用户user=userMapper.getOne(param.getLoginName(),param.getLoginPassword());如果(用户!=null){userLog.setUserId(user.getId());userLog.setContent("获取用户信息成功");}else{userLog.setContent("未获取到用户信息");}}userLog.setIpAddress(InetAddress.getLocalHost().getHostAddress());userLog.setCreateTime(newDate());返回userLogMapper.insert(userLog);}}四、controllerpackagecom.baige.controller;importlombok.AllArgsConstructor;导入org.springframework.web.bind.annotation.*;导入com.baige.domain.User;导入com.baige.enums.LogType;导入com.baige.aop.annotation.Log;导入com.baige.service.UserService;@RestController@AllArgsConstructor@RequestMapping("/user")publicclassUserController{privatefinalUserServiceuserService;@PostMapping("/login")@Log(logType=LogType.login)publicStringlogin(@RequestBodyUserparams){Useruser=userService.login(params.getLoginName(),params.getLoginPassword());返回用户!=null?"登录成功":"登录失败";}}