一、创建日志注解 1、日志类型枚举类importlombok。G日志类型枚举类GetterpublicenumLogType{登录login(LoginLog);实现类名称privatefinalStringimplClassNLogType(StringimplClassName){this。implClassNameimplClassN}} 2、自定义日志注解importjava。lang。annotation。;importcom。baige。enums。LogT自定义日志注解注解说明:Documented:文档注解Retention(RetentionPolicy。RUNTIME):生命周期注解,注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在Target({ElementType。PARAMETER,ElementType。METHOD}):Target说明了Annotation所修饰的对象范围,ElementType。TYPE:接口、类、枚举、注解,ElementType。METHOD:方法DocumentedRetention(RetentionPolicy。RUNTIME)Target({ElementType。PARAMETER,ElementType。METHOD})publicinterfaceLog{登录类型LogTypelogType();} 二、利用AOP实现日志切面统一处理 1、日志实现类创建工厂importcom。baige。enums。LogTimportcom。baige。util。SpringContextHimportorg。springframework。context。ApplicationC日志实现类创建工厂publicclassLogFactory{publicstaticApplicationCpublicstaticIUserLoggetInstance(LogTypelogType){return(IUserLog)SpringContextHolder。getBean(logType。getImplClassName());}} 2、切面类importlombok。extern。slf4j。Slf4j;importcom。baige。aop。log。IUserLimportcom。baige。aop。annotation。Limportcom。baige。aop。log。LogFimportorg。aspectj。lang。annotation。;importorg。aspectj。lang。ProceedingJoinPimportorg。aspectj。lang。reflect。MethodSimportorg。springframework。stereotype。CSlf4jAspectComponentpublicclassLogAspect{定义切入点,切入点为com。baige。controller。AopController中的所有函数通过Pointcut注解声明频繁使用的切点表达式Pointcut(execution(publiccom。baige。controller。UserController。(。。))))publicvoidpointcut(){}Around(pointcut())publicvoiddoAround(ProceedingJoinPointpjp){try{MethodSignaturemethodSignature(MethodSignature)pjp。getSignature();LoglogmethodSignature。getMethod()。getAnnotation(Log。class);IUserLoguserLogLogFactory。getInstance(log。logType());userLog。addLog(pjp,log);}catch(Throwablethrowable){log。info(日志记录异常,不影响正常业务,throwable);}}} 三、创建日志实现类 1、添加日志接口importcom。baige。aop。annotation。Limportorg。aspectj。lang。ProceedingJoinPimportjava。net。UnknownHostEpublicinterfaceIUserLog{添加日志intaddLog(ProceedingJoinPointpjp,Loglog)throwsUnknownHostE} 2、添加日志接口实现类importjava。util。Dimportjava。net。InetAimportjava。net。UnknownHostEimportlombok。AllArgsCimportorg。aspectj。lang。ProceedingJoinPimportorg。springframework。stereotype。Cimportcom。baige。domain。Uimportcom。baige。domain。UserLimportcom。baige。aop。log。IUserLimportcom。baige。mapper。UserMimportcom。baige。aop。annotation。Limportcom。baige。mapper。UserLogMAllArgsConstructorComponent(LoginLog)publicclassLoginLogimplementsIUserLog{privatefinalUserMapperuserMprivatefinalUserLogMapperuserLogMOverridepublicintaddLog(ProceedingJoinPointpjp,Loglog)throwsUnknownHostException{UserLoguserLognewUserLog();Object〔〕paramspjp。getArgs();if(params。length0){Userparam(User)params〔0〕;UseruseruserMapper。getOne(param。getLoginName(),param。getLoginPassword());if(user!null){userLog。setUserId(user。getId());userLog。setContent(获取用户信息成功);}else{userLog。setContent(未获取到用户信息);}}userLog。setIpAddress(InetAddress。getLocalHost()。getHostAddress());userLog。setCreateTime(newDate());returnuserLogMapper。insert(userLog);}} 四、controllerpackagecom。baige。importlombok。AllArgsCimportorg。springframework。web。bind。annotation。;importcom。baige。domain。Uimportcom。baige。enums。LogTimportcom。baige。aop。annotation。Limportcom。baige。service。UserSRestControllerAllArgsConstructorRequestMapping(user)publicclassUserController{privatefinalUserServiceuserSPostMapping(login)Log(logTypeLogType。login)publicStringlogin(RequestBodyUserparams){UseruseruserService。login(params。getLoginName(),params。getLoginPassword());returnuser!null?登录成功:登录失败;}}路漫漫其修远兮,吾将上下而求索 译文:在追寻真理方面,前方的道路还很漫长,但我将百折不挠,不遗余力地去追求和探索。 如果您有什么好的想法与方法,欢迎在评论区留言,我们一起讨论