优雅哥--如何优雅的监控接口的执行情况

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

js 复制代码
@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;
        }
    }

}

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

相关推荐
Victor35639 分钟前
MongoDB(31)索引对查询性能有何影响?
后端
Victor3561 小时前
MongoDB(30)如何删除索引?
后端
lizhongxuan1 小时前
多 Agent 协同机制对比
后端
IT_陈寒2 小时前
SpringBoot项目启动慢?5个技巧让你的应用秒级响应!
前端·人工智能·后端
树上有只程序猿2 小时前
2026低代码选型指南,主流低代码开发平台排名出炉
前端·后端
高端章鱼哥2 小时前
为什么说用OpenClaw对打工人来说“不划算”
前端·后端
大脸怪2 小时前
告别 F12!前端开发者必备:一键管理 localStorage / Cookie / SessionStorage 神器
前端·后端·浏览器
用户8356290780512 小时前
使用 C# 在 Excel 中创建数据透视表
后端·python
架构师沉默3 小时前
别又牛逼了!AI 写 Java 代码真的行吗?
java·后端·架构
zone77393 小时前
006:RAG 入门-面试官问你,RAG 为什么要切块?
后端·算法·面试