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;privateint logType;privateString logContent;privateint operateType;privateString userid;privateString username;privateString ip;privateString method;privateString requestUrl;privateString requestParam;privateString requestType;privatelong costTime;privateString createBy;privateDate createTime;privateString updateBy;privateDate updateTime;}
4.创建系统日志注解
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceAutoLog{Stringvalue()default"";intlogType()default2;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()));}HttpServletRequest request=getHttpServletRequest();
dto.setRequestParam(getRequestParams(request,point));
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地址