使用Java实现接口拦截器来监控接口的执行情况

 更新时间:2024年01月30日 08:16:11   作者:源码超级联盟  
在排查问题的时候,由于没有对接口的执行情况,以及入参进行监控,所以排查起问题就特别费劲,今天我们就一起来写一个接口的拦截器来监控接口的执行情况吧

在工作中,我们往往会遇到一些接口的报错,在排查问题的时候,由于没有对接口的执行情况,以及入参进行监控,所以排查起问题就特别费劲,今天我们就一起来写一个接口的拦截器。

@Slf4j
@Aspect
@Component
public class LogAspect {

    @SneakyThrows
    @Around("execution(* cn.com.alliance.we.controller..*(..))")
    public Object doAround(ProceedingJoinPoint pjp){
        // 创造计时器
        Stopwatch stWatch = Stopwatch.createStarted();
        //获取请求信息
        ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = sra.getRequest();
        String tenantId = "unknown";
        try {
            tenantId = TenantContextHolder.getTenantId().toLowerCase(Locale.ROOT);
        }catch (Exception e){
            log.error("LogAspect获取租户异常:", e);
        }
        //获取请求地址
        String requestURI = request.getRequestURI();
        //组合请求参数,进行日志打印
        Object[] objects = pjp.getArgs();
        Object[] arguments  = new Object[objects.length];
        for (int i = 0; i < objects.length; i++) {
            if (objects[i] instanceof ServletRequest || objects[i] instanceof ServletResponse || objects[i] instanceof MultipartFile) {
                //过滤掉不能序列化的参数
                continue;
            }
            arguments[i] = objects[i];
        }
        //获取登录信息
        OcManageUser currentUserOrNull = OcManageUserContext.getCurrentUserOrNull();
        String currentOrgCode = "Unknown";
        String currentEmpCode = "Unknown";
        if(currentUserOrNull != null){
            currentOrgCode = currentUserOrNull.getOrgCode();
            currentEmpCode = currentUserOrNull.getEmpCode();
        }
        Object result = null;
        try {
            result = pjp.proceed();
            //请求操作成功
            String resultJosnString = "";
            if (result != null) {
                try{
                    resultJosnString = JsonUtil.bean2Json(result);
                }catch (Exception e){
                    resultJosnString = String.valueOf(result);
                }
            }
            //记录请求完成执行时间:
            long usedTime = stWatch.elapsed(TimeUnit.MILLISECONDS);
            //记录日志
            if (log.isInfoEnabled()) {
                log.info("URI信息:{},租户:{},登录人:{},登录网点:{}, 耗时:{},请求参数:{}, 响应参数:{}", v("requestURI", requestURI),tenantId,currentEmpCode,currentOrgCode, v("elapsed", usedTime), JsonUtil.bean2Json(arguments), resultJosnString);
            }
            return result;
        }catch (Throwable et){
            //请求异常操作
            //记录请求完成执行时间:
            long usedTime = stWatch.elapsed(TimeUnit.MILLISECONDS);
            //记录日志
            log.error("URI信息:{},租户:{},登录人:{},登录网点:{}, 耗时:{},请求参数:{}, 响应异常信息:", v("requestURI", requestURI),tenantId,currentEmpCode,currentOrgCode, v("elapsed", usedTime), JsonUtil.bean2Json(arguments), et);
            throw et;
        }
    }

}

写这么一个拦截器并不复杂,主要的还是需要注意一些细节,比如过滤掉一些不能序列化的参数;还有就是可以根据自己的需要,将请求头的参数也打印出来。

到此这篇关于使用Java实现接口拦截器来监控接口的执行情况的文章就介绍到这了,更多相关Java接口拦截器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解记录Java Log的几种方式

    详解记录Java Log的几种方式

    很多小伙伴不知道如何记录日志,今天特地整理了本篇文章,文中有非常详细的介绍及代码示例,对小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • java日期时间格式化@JsonFormat与@DateTimeFormat的使用

    java日期时间格式化@JsonFormat与@DateTimeFormat的使用

    本文主要介绍了java日期时间格式化@JsonFormat与@DateTimeFormat的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • @feignclient名字冲突的解决方案

    @feignclient名字冲突的解决方案

    这篇文章主要介绍了@feignclient名字冲突的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 详解SpringBoot如何统一后端返回格式

    详解SpringBoot如何统一后端返回格式

    今天我们来聊一聊在基于SpringBoot前后端分离开发模式下,如何友好的返回统一的标准格式以及如何优雅的处理全局异常,感兴趣的可以了解一下
    2021-07-07
  • 基于parameters参数实现参数化过程解析

    基于parameters参数实现参数化过程解析

    这篇文章主要介绍了基于parameters参数实现参数化过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Java线程中的ThreadLocal原理及源码解析

    Java线程中的ThreadLocal原理及源码解析

    这篇文章主要介绍了Java线程中的ThreadLocal原理及源码解析,ThreadLocal 的作用是为每个线程保存一份局部变量的引用,实现多线程之间的数据隔离,从而避免了线程不安全情况的发生,需要的朋友可以参考下
    2023-12-12
  • springcloud ribbon 饥饿加载原理解析

    springcloud ribbon 饥饿加载原理解析

    这篇文章主要介绍了springcloud ribbon 饥饿加载原理解析,饥饿加载特别适用于对启动性能要求较高的场景,如系统启动初期就有高并发请求的情况,感兴趣的朋友跟随小编一起学习吧
    2024-04-04
  • springboot项目连接多种数据库该如何操作详析

    springboot项目连接多种数据库该如何操作详析

    在Spring Boot应用中连接多个数据库或数据源可以使用多种方式,下面这篇文章主要给大家介绍了关于springboot项目连接多种数据库该如何操作的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • springboot使用@Slf4j进行日志的记录步骤详解

    springboot使用@Slf4j进行日志的记录步骤详解

    这篇文章主要介绍了springboot使用@Slf4j进行日志的记录,使用@Slf4j的注解进行日志记录非常方便,本文给大家分享操作步骤,需要的朋友可以参考下
    2023-08-08
  • Java Base64 加密与解密示例代码

    Java Base64 加密与解密示例代码

    基本的加密尽量保持简单,加密输入字符串没有增加任何换行符。输出被映射到“A-Za-z0-9+/”字符集中,解密从该字符集中解析为任意字符,这篇文章主要介绍了Java Base64 加密与解密,需要的朋友可以参考下
    2022-12-12

最新评论