SpringBoot AOP+自定义注解实现日志功能

2022-11-01 09:09:55

1.创建系统日志数据库表

在这里插入图片描述

2.maven坐标

<dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.7</version><scope>runtime</scope></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.7</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

3.创建系统日志实体类

@DatapublicclassSysLogimplementsSerializable{privateString id;/**日志类型(1登录日志,2操作日志)*/privateint logType;/**日志内容*/privateString logContent;/**操作类型(1添加2修改3删除)*/privateint operateType;/**操作用户账号*/privateString userid;/**操作用户姓名*/privateString username;/**ip*/privateString ip;/**请求Java 方法*/privateString method;/**请求路径*/privateString requestUrl;/**请求参数*/privateString requestParam;/**请求类型*/privateString requestType;/**耗时*/privatelong costTime;privateString createBy;privateDate createTime;privateString updateBy;privateDate updateTime;}

4.创建系统日志注解

@Target(ElementType.METHOD)//target用于标识此注解能标记在方法上还是类上@Retention(RetentionPolicy.RUNTIME)//retention用于决定此注解的生命周期@Documentedpublic@interfaceAutoLog{/**日志内容*/Stringvalue()default"";/**日志类型(1登录日志,2操作日志)*/intlogType()default2;/**操作日志类型 1查询2添加3修改4删除*/intoperateType()default0;}

5.创建日志注解切面类

@Aspect@ComponentpublicclassAutoLogAspect{@AutowiredSysLogService sysLogService;privatestaticLogger logger=LoggerFactory.getLogger(AutoLogAspect.class);@Pointcut("@annotation(com.example.demo.commit.annotation.AutoLog)")publicvoidlogPointCut(){}@Around("logPointCut()")publicObjectaround(ProceedingJoinPoint point)throwsThrowable{long beginTime=System.currentTimeMillis();System.out.println("日志");//执行方法Object result= point.proceed();//执行时长long time=System.currentTimeMillis()-beginTime;//保存日志saveSysLog(point,time,result);return result;}privatevoidsaveSysLog(ProceedingJoinPoint point,long time,Object obj){MethodSignature signature=(MethodSignature) point.getSignature();Method method= signature.getMethod();SysLog dto=newSysLog();AutoLog syslog= method.getAnnotation(AutoLog.class);if(syslog!=null){String content= syslog.value();
            dto.setLogType(syslog.logType());
            dto.setLogContent(content);}//请求的方法名String className= point.getTarget().getClass().getName();String methodName= signature.getName();
        dto.setMethod(className+"."+methodName+"()");//设置操作类型if(dto.getLogType()==2){
            dto.setOperateType(getOperateType(methodName,syslog.operateType()));}//获取requestHttpServletRequest request=getHttpServletRequest();//请求的参数
        dto.setRequestParam(getRequestParams(request,point));//设置ip地址
        dto.setIp(getIpAddr(request));//获取用户登录信息TUser user=(TUser)SecurityUtils.getSubject().getPrincipal();if(user!=null){
            dto.setUserid(user.getUserName());
            dto.setUsername(user.getPassWord());}
        dto.setCostTime(time);
        dto.setCreateTime(newDate());

        sysLogService.save(dto);}privateintgetOperateType(String methodName,int operateType){if(operateType>0){return operateType;}if(methodName.startsWith("list")){return1;}if(methodName.startsWith("add")){return2;}if(methodName.startsWith("edit")){return3;}if(methodName.startsWith("delete")){return4;}if(methodName.startsWith("import")){return5;}if(methodName.startsWith("export")){return6;}return1;}privateHttpServletRequestgetHttpServletRequest(){return((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();}privateStringgetRequestParams(HttpServletRequest request,JoinPoint joinPoint){String httpMethod= request.getMethod();String param="";if("POST".equals(httpMethod)||"PUT".equals(httpMethod)||"PATCH".equals(httpMethod)){Object[] paramArray= joinPoint.getArgs();Object[] arguments=newObject[paramArray.length];for(int i=0; i< paramArray.length; i++){if(paramArray[i]instanceofBindingResult|| paramArray[i]instanceofServletRequest|| paramArray[i]instanceofServletResponse|| paramArray[i]instanceofMultipartFile){continue;}
                arguments[i]= paramArray[i];}PropertyFilter propertyFilter=newPropertyFilter(){@Overridepublicbooleanapply(Object object,String name,Object value){if(value!=null&& value.toString().length()>500){returnfalse;}returntrue;}};
            param=JSONObject.toJSONString(arguments,propertyFilter);}else{MethodSignature signature=(MethodSignature) joinPoint.getSignature();Method method= signature.getMethod();//请求的方法参数值Object[] args= joinPoint.getArgs();//请求的方法名称LocalVariableTableParameterNameDiscoverer u=newLocalVariableTableParameterNameDiscoverer();String[] parameterNames= u.getParameterNames(method);if(args!=null&& parameterNames!=null){for(int i=0; i< args.length; i++){
                    param+=" "+ parameterNames[i]+": "+ args[i];}}}return param;}publicStringgetIpAddr(HttpServletRequest request){String ip=null;try{
            ip= request.getHeader("x-forwarded-for");if(StringUtils.isEmpty(ip)||"unknown".equalsIgnoreCase(ip)){
                ip= request.getHeader("Proxy-Client-IP");}if(StringUtils.isEmpty(ip)|| ip.length()==0||"unknown".equalsIgnoreCase(ip)){
                ip= request.getHeader("WL-Proxy-Client-IP");}if(StringUtils.isEmpty(ip)||"unknown".equalsIgnoreCase(ip)){
                ip= request.getHeader("HTTP_CLIENT-IP");}if(StringUtils.isEmpty(ip)||"unknown".equalsIgnoreCase(ip)){
                ip= request.getHeader("HTTP_X-FORWARDED-FOR");}if(StringUtils.isEmpty(ip)||"unknown".equalsIgnoreCase(ip)){
                ip= request.getRemoteAddr();}}catch(Exception e){
            logger.error("IP error",e);}return ip;}}

6.在controller层的方法添加系统日志注解

@AutoLog(value="easyPoi导入")@ApiOperation("easyPoi导入")@GetMapping("/importEasyPoi")@ResponseBodypublicResult<TUser>easyPoiImport(@RequestParam("file")MultipartFile file){try{
            userService.easyPoiImport(file);returnResultUtil.success();}catch(Exception e){
            e.printStackTrace();returnResultUtil.fail(201,"导入失败");}}

gitee地址

  • 作者:ArrayStoreException
  • 原文链接:https://blog.csdn.net/weixin_46046653/article/details/121288496
    更新时间:2022-11-01 09:09:55