[java]如何通过AOP打日志

Posted 盖丽男

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[java]如何通过AOP打日志相关的知识,希望对你有一定的参考价值。

需求

把接口的入参出参打印出来

代码

因为只是需要接口的入参出参,所以我们拦截controller文件夹就可以。

@Component
@Aspect
@Slf4j
public class MethodLogAspect 


  @Around("execution(public * com.test.log.controller..*.*(..))")
  public Object doAuthMethodInterrupt(ProceedingJoinPoint point) 
    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = attributes.getRequest();
    String methodName = point.getSignature().getName();
    String userId = request.getHeader(HeaderParamKeyEunm.USER_ID.getValue());

    // 入参
    Object[] paramArr = point.getArgs();

    //序列化时过滤掉request和response
    List<Object> logArgs = streamOf(paramArr)
            .filter(arg -> (!(arg instanceof HttpServletRequest)
                    && !(arg instanceof HttpServletResponse
            )))
            .collect(Collectors.toList());

    // 入参打印
    String reqId = System.currentTimeMillis() + "-" + DingCallbackCrypto.Utils.getRandomStr(6);
    ThreadContext.setReqId(reqId);
    log.info(">>>>>>>>>>>> ReqId: ***** Method: ***** UserId: ***** Param:"
            , reqId, methodName, userId, JSONObject.toJSONString(logArgs));
    try 
      long currentTimeStampBegin = System.currentTimeMillis();
      Object obj = point.proceed();
      long diff = System.currentTimeMillis() - currentTimeStampBegin;
      // 出参打印
      log.info("<<<<<<<<<<<< ReqId: ***** Response: ***** Diff:ms", reqId, JSONObject.toJSONString(obj), diff);
      return obj;
     catch (Throwable e) 
      log.error("<<<<<<<<<<<< ReqId:,REQUEST_ERROR_MSG:", reqId, e.getMessage());
//      throw new RuntimeException(e);
      e.printStackTrace();
      return Result.SYSTEM_ERROR();

     
  

  public static <T> Stream<T> streamOf(T[] array) 
    return ArrayUtils.isEmpty(array) ? Stream.empty() : Arrays.stream(array);
  

总结

这种打日志的方式是去年新学的,面试的时候经常会被问到IOC,AOP,但是自己实际上没有真的去用过,或者说用了也感觉不是非常的有感触,去年的时候可能是因为频繁的启动新项目,所有有了很多从0到1的过程,从同事身上学到了很多有用的知识和技巧,也接触了很多好玩的东西,对于一些项目启动初期的支持性建设,比如异常管理和拦截,接口访问控制,日志等都有了一些新的理解,还是挺有收获的。

以上是关于[java]如何通过AOP打日志的主要内容,如果未能解决你的问题,请参考以下文章

使用AOP统一处理Web请求日志

通过AOP实现全局日志打印

Spring AOP 切面编程记录日志和接口执行时间

Spring AOP 切面编程记录日志和接口执行时间

化繁就简,如何利用Spring AOP快速实现系统日志

Java分享客栈 超简洁SpringBoot使用AOP统一日志管理