aop实现请求入参出参日志打印


@Slf4j
@Aspect
@Component
public class ControllerLog {
    private final ThreadLocal<Long> startTimeThreadLocal =
            new NamedThreadLocal<>("ThreadLocal StartTime");

    private final ThreadLocal<String> logPrefixThreadLocal =
            new NamedThreadLocal<>("ThreadLocal LogPrefix");

    @Autowired
    private ObjectMapper objectMapper;

    /**
     * <li>Before       : 在方法执行前进行切面</li>
     * <li>execution    : 定义切面表达式</li>
     * <p>public * com.test.controller..*.*(..)
     * <li>public :匹配所有目标类的public方法,不写则匹配所有访问权限</li>
     * <li>第一个* :方法返回值类型,*代表所有类型 </li>
     * <li>第二个* :包路径的通配符</li>
     * <li>第三个..* :表示controller这个目录下所有的类,包括子目录的类</li>
     * <li>第四个*(..) : *表示所有任意方法名,..表示任意参数</li>
     * </p>
     */
    @Pointcut("execution(public * com.test.controller..*.*(..))")
    public void executionMethod() {
        // do nothing
    }

    @Before("executionMethod()")
    public void doBefore(JoinPoint joinPoint) {
        startTimeThreadLocal.set(System.currentTimeMillis());
        StringBuilder argsDes = new StringBuilder();
        //获取类名
        String className = joinPoint.getSignature().getDeclaringType().getSimpleName();
        //获取方法名
        String methodName = joinPoint.getSignature().getName();
        String logPrefix = className + CommonConstant.DOT + methodName;
        logPrefixThreadLocal.set(logPrefix);
        try {
            //获取传入目标方法的参数
            Object[] args = joinPoint.getArgs();
            for (int i = 0; i < args.length; i++) {
                String jsonArgs = objectMapper.writeValueAsString(args[i]);
                argsDes.append("第").append(i + 1).append("个参数为:").append(jsonArgs).append(CommonConstant.COMMA);
            }
            if (argsDes.length() > 0) {
                argsDes.deleteCharAt(argsDes.length() - 1);
            }
        } catch (Exception e) {
            log.error("[{}]异常", logPrefix, e);
        }
        log.info("[{}]入参为:[{}]", logPrefix, argsDes);
    }

    @AfterReturning(pointcut = "executionMethod()", returning = "rtn")
    public Object doAfter(Object rtn) {
        long endTime = System.currentTimeMillis();
        long begin = startTimeThreadLocal.get();
        String logPrefix = logPrefixThreadLocal.get();
        String jsonArgs = null;
        try {
            jsonArgs = objectMapper.writeValueAsString(rtn);
        } catch (Exception e) {
            log.error(logPrefix + "异常", e);
        }
        log.info("[{}]出参为:[{}],耗时:[{}]", logPrefix, jsonArgs, endTime - begin);
        destroyThreadLocal();
        return rtn;
    }

    private void destroyThreadLocal() {
        startTimeThreadLocal.remove();
        logPrefixThreadLocal.remove();
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值