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

概述
接到的需求是给请求和返回加日志 直接入库,方便排查问题,首先想到的是用拦截器做一下拦截,这个时候遇到了从请求头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();
    }

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值