springboot实战(十二)之通过注解的方式记录接口出入参log&入库

前言

生产过程中,为了更好的辅助线上问题排查避免不了对接口出入参进行日志输出的时候,并且为了分析接口数据效果需要将每次请求接口的出入参进行落库方便后续的数据分析,这时总不能每个接口入参之后、出参之前都打印一遍日志吧?如果需要入库也总不能每个接口下面在调用一次入库方法吧?那这样做代码显的也太臃肿了,所以这时候我们通过注解的方式进行出入参的输出或入库,功能就变成了可插拔,会显得代码非常整洁,而且代码的可用性也会大大提高。一劳永逸,装逼神器。

1. 环境

JDK 1.8

springboot 2.7.15

2.依赖

java 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

3.代码

3.1创建注解
java 复制代码
package com.iterge.iterge_pre.annontation;

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

/**
 * @author iterge
 * @date 2023/11/10 15:04:36
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SaveLogInfo {
}
3.2创建切面
java 复制代码
package com.iterge.iterge_pre.aop;

import com.alibaba.fastjson2.JSONObject;
import com.iterge.iterge_pre.entity.Log;
import com.iterge.iterge_pre.service.ILogService;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
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;

/**
 * @author iterge
 * @date 2023/11/10 15:06:46
 */

@Slf4j
@Component
@Aspect
public class SaveLogInfoAspect {

    @Autowired
    private HttpServletRequest request;

    @Autowired
    private ILogService iLogService;

    @SneakyThrows
    @Around("@annotation(com.iterge.iterge_pre.annontation.SaveLogInfo)")
    public Object saveLog(ProceedingJoinPoint point){
        //获取请求路径
        String requestURI = request.getRequestURI();
        //获取请求参数
        Object[] args = point.getArgs();
        String req = JSONObject.toJSONString(args);
        log.info("请求参数:{}",req);
        //获取响应参数
        String proceed = JSONObject.toJSONString(point.proceed());
        log.info("响应参数:{}",proceed);
        try {
            saveLog(req,proceed,requestURI);
            int a = 10/0;
        }catch (Exception e){
            log.info("方法出入参入库失败!");
        }
        return point.proceed();
    }

    private void saveLog(String req,String res,String url){
        Log logInfo = new Log();
        logInfo.setReq(req);
        logInfo.setRes(res);
        logInfo.setUrl(url);
        try{
            iLogService.save(logInfo);
        }catch (Exception e){
            log.error("日志保存失败,req:{},res{}",req,res,e);
        }

    }
}
3.3测试接口
java 复制代码
    @GetMapping("/test")
    @SaveLogInfo
    public Response<String> test(@RequestParam String name){
        String s = iUserInfoService.saveLog(name);
        return Response.ok(s);
    }
3.4效果
相关推荐
初晴~2 分钟前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
黑胡子大叔的小屋1 小时前
基于springboot的海洋知识服务平台的设计与实现
java·spring boot·毕业设计
ThisIsClark1 小时前
【后端面试总结】深入解析进程和线程的区别
java·jvm·面试
计算机毕设孵化场1 小时前
计算机毕设-基于springboot的校园社交平台的设计与实现(附源码+lw+ppt+开题报告)
spring boot·课程设计·计算机毕设论文·计算机毕设ppt·计算机毕业设计选题推荐·计算机选题推荐·校园社交平台
雷神乐乐2 小时前
Spring学习(一)——Sping-XML
java·学习·spring
苹果醋32 小时前
Golang的文件加密工具
运维·vue.js·spring boot·nginx·课程设计
小林coding2 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
V+zmm101342 小时前
基于小程序宿舍报修系统的设计与实现ssm+论文源码调试讲解
java·小程序·毕业设计·mvc·ssm
文大。3 小时前
2024年广西职工职业技能大赛-Spring
java·spring·网络安全
一只小小翠3 小时前
EasyExcel 模板+公式填充
java·easyexcel