首页 > 其他分享 >使用Spring AOP做一个日志切面类

使用Spring AOP做一个日志切面类

时间:2024-07-12 11:20:22浏览次数:10  
标签:info args LOG Spring AOP 切面 org import aspectj

日志切面类用于记录Controller层的方法执行前和执行后的日志信息。定义一个切面类,并在该类中声明增强方法(如@Before、@After、@Around等注解的方法),然后在这些增强方法中通过JoinPoint参数获取当前连接点的信息,如方法名、参数、目标对象等。最后,在配置文件中声明切面和切点,将增强方法与切点关联起来,实现切面逻辑的插入。

 1 package com.venux.train.common.aspect;
 2 
 3 import cn.hutool.core.util.RandomUtil;
 4 import com.alibaba.fastjson.JSONObject;
 5 import com.alibaba.fastjson.support.spring.PropertyPreFilters;
 6 import jakarta.servlet.ServletRequest;
 7 import jakarta.servlet.ServletResponse;
 8 import jakarta.servlet.http.HttpServletRequest;
 9 import org.aspectj.lang.JoinPoint;
10 import org.aspectj.lang.ProceedingJoinPoint;
11 import org.aspectj.lang.Signature;
12 import org.aspectj.lang.annotation.Around;
13 import org.aspectj.lang.annotation.Aspect;
14 import org.aspectj.lang.annotation.Before;
15 import org.aspectj.lang.annotation.Pointcut;
16 import org.slf4j.Logger;
17 import org.slf4j.LoggerFactory;
18 import org.slf4j.MDC;
19 import org.springframework.stereotype.Component;
20 import org.springframework.web.context.request.RequestContextHolder;
21 import org.springframework.web.context.request.ServletRequestAttributes;
22 import org.springframework.web.multipart.MultipartFile;
23 
24 @Aspect
25 @Component
26 public class LogAspect {
27     public LogAspect() {
28         System.out.println("Common LogAspect");
29     }
30 
31     private final static Logger LOG = LoggerFactory.getLogger(LogAspect.class);
32 
33     /**
34      * 定义一个切点
35      */
36     @Pointcut("execution(public * com.venux..*Controller.*(..))")
37     public void controllerPointcut() {
38     }
39 
40     @Before("controllerPointcut()")
41     public void doBefore(JoinPoint joinPoint) {
42 
43 
44         // 开始打印请求日志
45         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
46         HttpServletRequest request = attributes.getRequest();
47         Signature signature = joinPoint.getSignature();
48         String name = signature.getName();
49 
50         // 打印请求信息
51         LOG.info("------------- 开始 -------------");
52         LOG.info("请求地址: {} {}", request.getRequestURL().toString(), request.getMethod());
53         LOG.info("类名方法: {}.{}", signature.getDeclaringTypeName(), name);
54         LOG.info("远程地址: {}", request.getRemoteAddr());
55 
56         // 打印请求参数
57         Object[] args = joinPoint.getArgs();
58         // LOG.info("请求参数: {}", JSONObject.toJSONString(args));
59 
60         // 排除特殊类型的参数,如文件类型
61         Object[] arguments = new Object[args.length];
62         for (int i = 0; i < args.length; i++) {
63             if (args[i] instanceof ServletRequest
64                     || args[i] instanceof ServletResponse
65                     || args[i] instanceof MultipartFile) {
66                 continue;
67             }
68             arguments[i] = args[i];
69         }
70         // 排除字段,敏感字段或太长的字段不显示:身份证、手机号、邮箱、密码等
71         String[] excludeProperties = {};
72         PropertyPreFilters filters = new PropertyPreFilters();
73         PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();
74         excludefilter.addExcludes(excludeProperties);
75         LOG.info("请求参数: {}", JSONObject.toJSONString(arguments, excludefilter));
76     }
77 
78     @Around("controllerPointcut()")
79     public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
80         long startTime = System.currentTimeMillis();
81         Object result = proceedingJoinPoint.proceed();
82         // 排除字段,敏感字段或太长的字段不显示:身份证、手机号、邮箱、密码等
83         String[] excludeProperties = {};
84         PropertyPreFilters filters = new PropertyPreFilters();
85         PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();
86         excludefilter.addExcludes(excludeProperties);
87         LOG.info("返回结果: {}", JSONObject.toJSONString(result, excludefilter));
88         LOG.info("------------- 结束 耗时:{} ms -------------", System.currentTimeMillis() - startTime);
89         return result;
90     }
91 
92 }

 

           

标签:info,args,LOG,Spring,AOP,切面,org,import,aspectj
From: https://www.cnblogs.com/ccsu-kid/p/18297930

相关文章

  • 在springboot 中使用Apache HttpClient 4的详细示例
    在SpringBoot中使用ApacheHttpClient,可以通过配置HttpClient的Bean并使用它来发起HTTP请求。下面是一个详细的示例,展示了如何在SpringBoot应用中集成和使用ApacheHttpClient。步骤1:添加依赖在你的pom.xml文件中添加ApacheHttpClient的依赖:<dependency>......
  • 在springboot 中使用Apache HttpClient 5的详细示例
    ApacheHttpComponentsClient5.x是HttpClient的最新版本,与4.x系列相比,5.x系列进行了许多改进和重构,提供了更现代的API和更好的性能。以下是使用步骤步骤1:添加依赖在你的pom.xml文件中添加ApacheHttpClient5.x的依赖:<dependency><groupId>org.apache.htt......
  • springboot快速整合任务
    springboot整合任务有很多种方法,下面以Quartz跟Task作为整合,快速把握。其中Task是比较常用以及我个人推荐,而且上手比较简单。Task技术整合spring根据定时任务的特征,将定时任务的开发简化到了极致。在springboot项目中使用也是同样的道理。只要设置一个定时任务告诉容器有,然后定......
  • 使用Spring Boot集成Swagger文档
    使用SpringBoot集成Swagger文档大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!1.什么是Swagger?Swagger是一个开源框架,用于设计、构建、文档化和使用RESTfulWeb服务。它允许开发者设计API并生成相应的文档,同时提供了交互式的API文档,便于开发者理解和......
  • 使用Spring Boot实现跨域资源共享(CORS)
    使用SpringBoot实现跨域资源共享(CORS)大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!1.CORS概述跨域资源共享(CORS)是一种机制,使用额外的HTTP头部来告诉浏览器允许运行在一个域上的Web应用访问来自不同源服务器上的指定资源。在现代Web应用中,由于安全策......
  • 【微服务】SpringCloud-eureka光速入门
    SpringCloud-eureka光速入门一、Eureka主要组件二、工作流程三、优势四、Eureka-光速入门【重点】4.1案例准备4.1.1创建父工程tingyi-shop4.1.2创建子工程tingyi-goods4.1.3创建子工程tingyi-order4.1.4案例调整4.1.4.1在order模块创建RestTemplate对象4......
  • Spring Aop 获取入参和出参
    1.概述本次,我利用SpringAop的注解方式获取切入点的入参和出参,因为比较简单,所以就直接上代码了。2.代码编写注解类/***日志注解**@authorJiantaoYan*@title:Log*@date2021/1/520:33*/@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUN......
  • Spring AOP 切面执行顺序
    1.概述1.1术语SpringAOP的相关术语:Aspect:切面,由一系列切点、增强和引入组成的模块对象,可定义优先级,从而影响增强和引入的执行顺序。事务管理(Transactionmanagement)在java企业应用中就是一个很好的切面样例。Joinpoint:接入点,程序执行期的一个点,例如方法执行、类初始化、......
  • Java毕业设计基于Vue+SpringBoot的电影院订票选座管理系统(代码+数据库+文档LW+运行成
    很多朋友发现后期找不到文章,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍在飞速发展的今天,网络已成为人们重要的交流平台。电影院每天都有大量的需要通过网络发布,为此,本人开发了一个基于B/S;浏览器/服务器;模式的电影院管理系统。该系......
  • Java毕业设计基于Vue+SpringBoot的畅游游戏销售平台(代码+数据库+文档LW+运行成功)
    很多朋友发现后期找不到文章,收藏关注不迷路文章目录项目介绍技术介绍项目界面关键代码目录项目介绍近些年来,随着科技的飞速发展,互联网的普及逐渐延伸到各行各业中,给人们生活带来了十分的便利,畅游游戏销售平台利用计算机网络实现信息化管理,使整个畅游游戏销售平......