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

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

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;
        }
    }

}

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

相关推荐
开开心心_Every3 分钟前
强制打字练习工具:打够百字才可退出
java·游戏·微信·eclipse·pdf·excel·语音识别
xiaolyuh1233 分钟前
Redis 核心业务流程
java·redis·spring
BD_Marathon5 分钟前
MyBatis——封装SqlSessionUtils工具类并测试功能
java·windows·mybatis
浩瀚地学9 分钟前
【Java】集合-Collection
java·开发语言·经验分享·笔记·学习
源代码•宸12 分钟前
Golang原理剖析(string面试与分析、slice、slice面试与分析)
后端·算法·面试·golang·扩容·string·slice
回家路上绕了弯12 分钟前
Spring Boot多数据源配置实战指南:从选型到落地优化
分布式·后端
盛者无名14 分钟前
Rust语言基础
开发语言·后端·rust
wangkay8818 分钟前
【Java 转运营】Day03:抖音直播间自然流运营
java·开发语言·新媒体运营
计算机程序设计小李同学19 分钟前
平价药店销售与管理系统
java·mysql·spring·spring cloud·ssm
黎雁·泠崖19 分钟前
吃透Java操作符高阶:位操作符+赋值操作符 全解析(Java&C区别+实战技巧+面试考点)
java·c语言·面试