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

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

注解


  
  1. @Target({ElementType.PARAMETER, ElementType.METHOD})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface Log {
  5. /**
  6. * 注释
  7. */
  8. String operationName() default "";
  9. }

注解aop


  
  1. @Component
  2. public class LogAspect {
  3. private Logger logger = LoggerFactory.getLogger(LogAspect.class);
  4. private String succeed = "true";
  5. /**
  6. * 在注释@log的方法中进入本类
  7. */
  8. @Pointcut("@annotation(com.resource.business.modular.log.annotation.Log)")
  9. public void logPointCut() {}
  10. /**
  11. * 前置通知 用于拦截操作,在方法返回后执行
  12. *
  13. * @param joinPoint 切点
  14. */
  15. @AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")
  16. public void doAfter(JoinPoint joinPoint, Result jsonResult) {
  17. handleLog(joinPoint, jsonResult);
  18. }
  19. /**
  20. * 拦截异常操作,有异常时执行
  21. *
  22. * @param joinPoint
  23. * @param e
  24. */
  25. @AfterThrowing(value = "logPointCut()", throwing = "e")
  26. public void doAfter(JoinPoint joinPoint, Exception e) {
  27. Log controllerLog = getAnnotationLog(joinPoint);
  28. // 没有注解
  29. if (controllerLog == null) {
  30. return;
  31. }
  32. // 处理入参
  33. String args = this.argsArrayToString(joinPoint.getArgs());
  34. // 获取请求上下文信息
  35. ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
  36. HttpServletRequest request = attributes.getRequest();
  37. HttpServletResponse response = attributes.getResponse();
  38. // 获取时间
  39. SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  40. // 获取用户信息
  41. String userName = (String.valueOf(SecurityContextHolder.getContext().getAuthentication().getPrincipal()));
  42. // 组合入参信息
  43. logger.error("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"
  44. + IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "操作日志" + "|" + "null" + "|" + "null");
  45. logger.error("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"
  46. + IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "接口日志" + "|" + request.getRequestURI() + "|" + args);
  47. logger.debug("错误信息为:" + e);
  48. }
  49. /**
  50. * 判断是否有注解
  51. *
  52. * @param joinPoint
  53. * @throws Exception
  54. */
  55. private Log getAnnotationLog(JoinPoint joinPoint) {
  56. Signature signature = joinPoint.getSignature();
  57. MethodSignature methodSignature = (MethodSignature)signature;
  58. Method method = methodSignature.getMethod();
  59. if (method != null) {
  60. return method.getAnnotation(Log.class);
  61. }
  62. return null;
  63. }
  64. /**
  65. * 功能描述:执行日志操作
  66. *
  67. * @param: joinPoint ,e ,response
  68. * @return:
  69. */
  70. private void handleLog(final JoinPoint joinPoint, Result jsonResult) {
  71. Log controllerLog = getAnnotationLog(joinPoint);
  72. // 没有注解
  73. if (controllerLog == null) {
  74. return;
  75. }
  76. // 处理入参
  77. String args = this.argsArrayToString(joinPoint.getArgs());
  78. // 获取请求上下文信息
  79. ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
  80. HttpServletRequest request = attributes.getRequest();
  81. HttpServletResponse response = attributes.getResponse();
  82. // 获取时间
  83. SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  84. // 获取用户信息
  85. String userName = (String.valueOf(SecurityContextHolder.getContext().getAuthentication().getPrincipal()));
  86. // 组合入参信息
  87. logger.info("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"
  88. + IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "操作日志" + "|" + "null" + "|" + "null");
  89. logger.info("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"
  90. + IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "接口日志" + "|" + request.getRequestURI() + "|" + args);
  91. logger.info("输出参数:" + JSONArray.toJSONString(jsonResult.getData()));
  92. }
  93. /**
  94. * 组装入参
  95. *
  96. * @param paramsArray
  97. * @return
  98. */
  99. private String argsArrayToString(Object[] paramsArray) {
  100. String params = "";
  101. if (paramsArray != null && paramsArray.length > 0) {
  102. for (int i = 0; i < paramsArray.length; i++) {
  103. if (!isFilterObject(paramsArray[i])) {
  104. Object jsonObj = JSON.toJSON(paramsArray[i]);
  105. params += jsonObj.toString() + " ";
  106. }
  107. }
  108. }
  109. if (("").equals(params.trim())) {
  110. params = "无入参";
  111. }
  112. return params.trim();
  113. }
  114. /**
  115. * 判断是否需要过滤的对象。
  116. *
  117. * @param o 对象信息。
  118. * @return 如果是需要过滤的对象,则返回true;否则返回false。
  119. */
  120. public boolean isFilterObject(final Object o) {
  121. return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse;
  122. }
  123. }

备注:楼主使用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个月内不可修改。