使用注解加切面记录请求日志,请求和返回参数

概述
接到的需求是给请求和返回加日志 直接入库,方便排查问题,首先想到的是用拦截器做一下拦截,这个时候遇到了从请求头body中拿 的json 数据时 只能读取一次的问题,参考了这篇博客,主要是通过一个类包一层request 在filter 中传播, 之后遇到了在响应中拿不到数据的,又上网找了一下别的博客 ,最后还是通过了通过切面加注解的方式来做日志记录. aop 切面 什么的概述什么的 应该都知道了 下面直接就是操作流程

  1. 首先pom 文件中引入 切面依赖
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.0</version>
        </dependency>
  1. 创建一个注解

/**
 * controller层日志打印注解
 *
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({
    
    ElementType.METHOD})
public @interface MethodLogger {
    
    

    /**
     * 日志打印类型, 默认请求日志全部打印
     *
     * @return
     */
    LogTypeEnum logType() default LogTypeEnum.FULL;

}
  1. 创建一个切面

/**
 * 记录日志类
 *
 * @author dzw
 */
@Aspect
@Component
@Slf4j
public class LoggerHandler {
    
    


    @Resource
    CallLogBoleService callLogBoleService;

    /**
     * 切点 --- 包含HttpLogger注解
     */
    @Pointcut("@annotation(com.jumstc.fengyu.fy3rd.aspect.MethodLogger)")
    protected void methodLogger() {
    
    }

    @Around("methodLogger()")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
    
    
    	// 获取request
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        long start = System.currentTimeMillis();
        String method = request.getMethod();
        StringBuffer requestURL = request.getRequestURL();
        String data = "";
        // 这是业务逻辑
        if (requestURL.toString().contains("api")) {
    
    
            method = request.getParameter("method");
            //以前的接口 参数在请求中
            data = request.getParameter("data");
        }else {
    
    
            //新版的 走post 的
            method = joinPoint.getSignature().getName();
            data = JsonUtil.toString(joinPoint.getArgs()[0]);
        }
        //这里就是开始执行方法 然后拿到返回值
        Object result = joinPoint.proceed();
        JSONObject jsonObject = JSONObject.parseObject(JSONUtil.toJsonStr(result));
        String code = jsonObject.getString("code");
        String msg = jsonObject.getString("msg");
        long endTime = System.currentTimeMillis();
        log.info("请求方法{},耗时{}",method,endTime-start);
        try {
    
    
        	//记录
            callLogBoleService.insert(method, data, CallLogBoleModel.REQUEST_LAUNCH_TYPE_BOLE, code,
                    msg);
        } catch (Exception e) {
    
    
            log.error("记录请求日志出错,method:{},args{}", method,data);
        }
        return result;
    }

}

  1. 在需要的controller 层方法上加注解
    /**
     * 
     */
    @RequestMapping(value = "/batchOrderState", produces = "application/json", method = RequestMethod.POST)
    @ResponseBody
    @MethodLogger
    public R batchOrderState(@RequestBody BoleOrderDefaultRequest defaultRequest) {
    
    
        R r = defaultRequest.checkParam();
        if (R.isFail(r)) {
    
    
            return r;
        }
        //业务代码
        return R.ok();
    }

还有一个博客 可以直接加日志
如果是想在所有的方法上面加记录 就没有必要用注解加切面 就直接切面就好了

猜你喜欢

转载自blog.csdn.net/hgdzw/article/details/107188854
今日推荐