当前位置:   article > 正文

SpringAop 项目日志埋点实战_@afterthrowing(pointcut = "logpointcut()", throwin

@afterthrowing(pointcut = "logpointcut()", throwing = "e")

文章目录

 


前言

SpringAop 想必大家都熟悉不能再熟悉了,AOP在项目中的使用场景有很多很多,今天主要是以日志收集为例,来使用一下AOP。

以下是一个简短的介绍:

一、日志有什么作用?

随着现代互联网的普遍,上到老下到小都在使用我们的智能收集,而互联网离不开的即时我们的软件,比如说:淘宝、抖音 基本上这两款应用以及让我们的生活离不开。

日志即是:用户访问我们系统,我们将用户的信息和用户访问的某个具体功能点和访问的时间频次记录起来。

作用:方便我们直接在管理端定位错误信息,错误位置。为了以后大数据计算提高用户体验度。

二、使用步骤

 1.导入 AOP 依赖

以SpringBoot 项目为例(示例):

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-aop</artifactId>
  4. </dependency>

 2. 设计组件注解

这里将日志模板设计为单独的组件,即是需要进行日志收集的项目引入改依赖

  1. /**
  2. * 系统日志注解
  3. *
  4. * @author Created by mr_zhou on 2020/1/30
  5. */
  6. @Target(ElementType.METHOD)
  7. @Retention(RetentionPolicy.RUNTIME)
  8. public @interface SysLog {
  9. // 接口描述
  10. String value() default "";
  11. // 0-后台 1-前台
  12. int type() default 1;
  13. }

 3. 编写日志切面 

  • @Pointcut :用于编写连接点的表达式,可以连接注解,具体方法等等..
    
  • @Around:环绕通知,在连接点前后都会执行,这样既可以拿到request也可用拿到response
  • @AfterThrowing:当发送异常是调用该通知,用于记录异常信息。
  1. /**
  2. * @author Created by mr_zhou on 2020/1/31
  3. */
  4. @Aspect
  5. @Component
  6. public class LoggingAspect {
  7. private final LoggingService loggingService;
  8. ThreadLocal<Long> currentTime = new ThreadLocal<>();
  9. private Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
  10. public LoggingAspect(LoggingService loggingService) {
  11. this.loggingService = loggingService;
  12. }
  13. @Pointcut("@annotation(top.ananas.modules.log.annotation.SysLog)")
  14. public void logPointcut() { }
  15. /**
  16. * 记录controller日志,包括请求、IP、参数
  17. * @param joinPoint
  18. * @return Object
  19. * @throws Throwable
  20. */
  21. @Around("logPointcut()")
  22. public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
  23. Object result;
  24. currentTime.set(System.currentTimeMillis());
  25. result = joinPoint.proceed();
  26. long time = System.currentTimeMillis() - currentTime.get();
  27. Log log = new Log("INFO",time);
  28. currentTime.remove();
  29. HttpServletRequest request = SpringContextHolder.getHttpServletRequest();
  30. long uid = getUid();
  31. String ip = StringUtils.getIp(SpringContextHolder.getHttpServletRequest());
  32. // 存库
  33. loggingService.saveLogging(getUsername(), ip, joinPoint, log, uid);
  34. // 打印到控制台
  35. printLogConsole(uid,StringUtils.getMobileSystem(request),request.getRequestURI().toString(),ip,time);
  36. return result;
  37. }
  38. /**
  39. * 配置异常通知
  40. *
  41. * @param joinPoint join point for advice
  42. * @param e exception
  43. */
  44. @AfterThrowing(pointcut = "logPointcut()", throwing = "e")
  45. public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
  46. Log log = new Log("ERROR",System.currentTimeMillis() - currentTime.get());
  47. currentTime.remove();
  48. log.setExceptionDetail(ThrowableUtils.getStackTrace(e).getBytes());
  49. String ip = StringUtils.getIp(SpringContextHolder.getHttpServletRequest());
  50. // 存储异常信息
  51. loggingService.saveLogging(getUsername(), ip, (ProceedingJoinPoint)joinPoint, log,getUid());
  52. }
  53. /**
  54. * 输出到控制台
  55. * @param userId
  56. * @param mobile
  57. * @param url
  58. * @param ip
  59. * @param time
  60. */
  61. private void printLogConsole(long userId,String mobile,String url,String ip,long time){
  62. // 记录下请求内容
  63. StringBuilder sb = new StringBuilder();
  64. sb.append(userId + "-" + mobile);
  65. sb.append(" - " + url + " - ");
  66. sb.append(ip + " - ");
  67. sb.append(time + "ms");
  68. logger.info(sb.toString());
  69. }
  70. private String getUsername() {
  71. try {
  72. return SecurityUtils.getUsername();
  73. } catch (Exception e) {
  74. return "";
  75. }
  76. }
  77. private Long getUid(){
  78. try {
  79. return SecurityUtils.getUserId();
  80. } catch (Exception e) {
  81. return 0L;
  82. }
  83. }
  84. }

效果

使用:在需要收集日志的接口上加入 注解 即会自动收集日志
项目目录结构:

数据库记录:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/266743
推荐阅读
相关标签
  

闽ICP备14008679号