springboot高级功能(四)业务实战,自定义注解收集操作日志

举报
小鲍侃java 发表于 2021/09/09 23:50:47 2021/09/09
【摘要】 注解 @Target({ElementType.PARAMETER, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Log { /** * 注释 */ String operation...

注解


      @Target({ElementType.PARAMETER, ElementType.METHOD})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      public @interface Log {
         /**
       * 注释
       */
          String operationName() default "";
      }
  
 

注解aop


      @Component
      public class LogAspect {
         private Logger logger = LoggerFactory.getLogger(LogAspect.class);
         private String succeed = "true";
         /**
       * 在注释@log的方法中进入本类
       */
          @Pointcut("@annotation(com.resource.business.modular.log.annotation.Log)")
         public void logPointCut() {}
         /**
       * 前置通知 用于拦截操作,在方法返回后执行
       *
       * @param joinPoint 切点
       */
          @AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")
         public void doAfter(JoinPoint joinPoint, Result jsonResult) {
              handleLog(joinPoint, jsonResult);
          }
         /**
       * 拦截异常操作,有异常时执行
       *
       * @param joinPoint
       * @param e
       */
          @AfterThrowing(value = "logPointCut()", throwing = "e")
         public void doAfter(JoinPoint joinPoint, Exception e) {
              Log controllerLog = getAnnotationLog(joinPoint);
             // 没有注解
             if (controllerLog == null) {
                 return;
              }
             // 处理入参
             String args = this.argsArrayToString(joinPoint.getArgs());
             // 获取请求上下文信息
              ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
              HttpServletRequest request = attributes.getRequest();
              HttpServletResponse response = attributes.getResponse();
             // 获取时间
              SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             // 获取用户信息
             String userName = (String.valueOf(SecurityContextHolder.getContext().getAuthentication().getPrincipal()));
             // 组合入参信息
              logger.error("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"
                  + IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "操作日志" + "|" + "null" + "|" + "null");
              logger.error("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"
                  + IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "接口日志" + "|" + request.getRequestURI() + "|" + args);
              logger.debug("错误信息为:" + e);
          }
         /**
       * 判断是否有注解
       *
       * @param joinPoint
       * @throws Exception
       */
         private Log getAnnotationLog(JoinPoint joinPoint) {
              Signature signature = joinPoint.getSignature();
              MethodSignature methodSignature = (MethodSignature)signature;
              Method method = methodSignature.getMethod();
             if (method != null) {
                 return method.getAnnotation(Log.class);
              }
             return null;
          }
          /**
           * 功能描述:执行日志操作
           *
           * @param: joinPoint ,e ,response
           * @return:
           */
         private void handleLog(final JoinPoint joinPoint, Result jsonResult) {
              Log controllerLog = getAnnotationLog(joinPoint);
              // 没有注解
             if (controllerLog == null) {
                 return;
              }
              // 处理入参
             String args = this.argsArrayToString(joinPoint.getArgs());
              // 获取请求上下文信息
              ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
              HttpServletRequest request = attributes.getRequest();
              HttpServletResponse response = attributes.getResponse();
              // 获取时间
              SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             // 获取用户信息
             String userName = (String.valueOf(SecurityContextHolder.getContext().getAuthentication().getPrincipal()));
             // 组合入参信息
              logger.info("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"
                  + IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "操作日志" + "|" + "null" + "|" + "null");
              logger.info("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"
                  + IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "接口日志" + "|" + request.getRequestURI() + "|" + args);
              logger.info("输出参数:" + JSONArray.toJSONString(jsonResult.getData()));
          }
         /**
       * 组装入参
       *
       * @param paramsArray
       * @return
       */
         private String argsArrayToString(Object[] paramsArray) {
             String params = "";
             if (paramsArray != null && paramsArray.length > 0) {
                 for (int i = 0; i < paramsArray.length; i++) {
                     if (!isFilterObject(paramsArray[i])) {
                         Object jsonObj = JSON.toJSON(paramsArray[i]);
                          params += jsonObj.toString() + " ";
                      }
                  }
              }
             if (("").equals(params.trim())) {
                  params = "无入参";
              }
             return params.trim();
          }
         /**
       * 判断是否需要过滤的对象。
       *
       * @param o 对象信息。
       * @return 如果是需要过滤的对象,则返回true;否则返回false。
       */
         public boolean isFilterObject(final Object o) {
             return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse;
          }
      }
  
 

备注:楼主使用elk收集了日志 输出在logstash中获取“|” 然后拆分成不同字段 并保存在es中 可在后续文章看到,

           输出的参数有 入参,出参,sql,方法名,系统名,调用ip等

文章来源: baocl.blog.csdn.net,作者:小黄鸡1992,版权归原作者所有,如需转载,请联系作者。

原文链接:baocl.blog.csdn.net/article/details/105811589

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。