首页 > 编程语言 >springBoot通过AOP(面向切面编程)实现自动保存请求日志

springBoot通过AOP(面向切面编程)实现自动保存请求日志

时间:2024-01-16 18:11:52浏览次数:37  
标签:lang methodName springBoot className 切面 AOP import 日志 annotation

1.定义注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD) // 指定该注解只能应用于方法上
@Retention(RetentionPolicy.RUNTIME) // 运行时生效
public @interface Loggable { }

2.编写切面的实现

import com.alibaba.fastjson.JSON;
import com.jeecg.modules.jmreport.domain.SignUpInfo;
import com.jeecg.modules.jmreport.mapper.WangXiaoMapper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

@Component
@Aspect
public class RequestResponseLoggerAspect {

//    private final Logger logger = LoggerFactory.getLogger(RequestResponseLoggerAspect.class);

    @Autowired
    private HttpServletRequest request;
    @Autowired
    private WangXiaoMapper wangXiaoMapper;

    @Around("@annotation(loggable)")
    public Object logMethodExecutionTime(ProceedingJoinPoint joinPoint, Loggable loggable) throws Throwable {
        long startTime = System.currentTimeMillis();

        String methodName = null;
        String className = null;
        Object result = null;
        Map<String, String[]> parameterMap = null;
        try {
            parameterMap = request.getParameterMap();
            methodName = joinPoint.getSignature().getName();
            className = joinPoint.getTarget().getClass().getSimpleName();

            result = joinPoint.proceed();

            //请求正常结束的日志
            saveToDatabase(methodName, className, parameterMap, result);
            return result;
        } catch (Exception e){
            //请求出错结束的日志
            saveToDatabase(methodName, className, parameterMap,e.getMessage());
            return e.getMessage();
        } finally {
//            long endTime = System.currentTimeMillis();
//            long executionTime = endTime - startTime;
//            logger.info("{}#{} executed in {} ms", className, methodName, executionTime);
        }
    }

    private void saveToDatabase(String methodName, String className, Map<String, String[]> parameterMap, Object result) {
        // 保存日志到数据库(写自己的业务代码,需要如何保存日志)
    }
}

3.Application启动类上添加@EnableAspectJAutoProxy注解

 4.需要保存日志的controller方法上添加注解@Loggable

 

标签:lang,methodName,springBoot,className,切面,AOP,import,日志,annotation
From: https://www.cnblogs.com/gfl-1112/p/17968222

相关文章

  • springboot~shardingsphere在非spring框架中的使用
    shardingsphere已经很方便的被springboot集成了,你只要引入sharding-jdbc-spring-boot-starter这个包就可以了,而如果是原生java的话,你就需要自己去实现了,主要是重新定义数据源,定义规则等问题,本文主要介绍原生环境下的shardingsphere的使用。依赖引用<dependencies><!--......
  • springboot第48集:【思维导图】地图,面向对象,异常,功能代码
    在SpringBoot中,可以通过编写拦截器(Interceptor)来对请求进行拦截与处理。下面是一个简单的拦截器实现示例:创建一个类并实现HandlerInterceptor接口publicclassAuthInterceptorimplementsHandlerInterceptor{@OverridepublicbooleanpreHandle(HttpServletRequest......
  • Springboot上传文件大小限制处理
    今天在开发过程中遇到一个文件上传的问题io.undertow.server.RequestTooBigException:UT000020:Connectionterminatedasrequestwaslargerthan10485760Servlet容器使用的是undertow,看异常信息应该是默认存在10MB的文件大小限制。百度了一下,找到如下配置,问题得以解决,记......
  • AOP
    本质:AspectOrientedProgramming,面向切面编程;是OOP的一种延伸,降低系统耦合性,提高了代码的利用率;底层基于动态代理(JDK动态代理和CGLib动态代理)和动态字节码技术来实现;作用:在不修改原有业务代码的情况下添加额外的功能,从而达到将功能性需求与非功能性需求分离的效果;示例:日志......
  • SpringBoot自定义注解实现操作日志记录
    1、增加依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>${spring-version}</version>......
  • 为什么很多公司 SpringBoot 项目禁止使用 Tomcat
    为什么很多公司SpringBoot项目禁止使用Tomcat学习改变命运,技术铸就辉煌。大家好,我是銘,全栈开发程序员。前言在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。同时,SpringBoot也支持Undertow容器,我们可以很方便的用......
  • springboot拦截器@resource注解注入为null解决方案 拦截适配配置
    springboot拦截器@resource注解注入为null解决方案 拦截适配配置为什么@resource注入为nullinteceptor在springcontext之前加载,注入必然是null解决方案加入注解@Bean,注意需要使用@Configuration,而不是@Component解决在Spring添加拦截器之前先自己创建一下这个SpringBean,这样......
  • Spring AOP 中@Pointcut的用法(多个Pointcut)
    SpringAOP中@Pointcut的用法(多个Pointcut)/**swagger切面,分开来写**/@Aspect@ComponentpublicclassApiOperationLogAspect{privateLoggerlogger=LoggerFactory.getLogger(this.getClass());@Pointcut("@annotation(io.swagger.annotations.ApiOperation......
  • springboot项目配置多数据源
    springboot项目配置多数据源//关键:mybatis文件的目录需要区分开来sqlSessionFactoryBean.setMapperLocations(newPathMatchingResourcePatternResolver().getResources("classpath:mybatis.myProjectOne/*.xml"));#从数据库配置,数据库的配置以spring.datasource.myPr......
  • Idea SpringBoot 子模块 加载不到该子模块根目录config下面的配置文件
    IdeaSpringBoot子模块加载不到该子模块根目录config下面的配置文件importorg.mybatis.spring.annotation.MapperScan;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframew......