前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Aop实现记录请求日志

Aop实现记录请求日志

作者头像
石臻臻的杂货铺[同名公众号]
发布2021-07-14 10:21:02
7590
发布2021-07-14 10:21:02
举报
文章被收录于专栏:kafka专栏
代码语言:javascript
复制
/**
 * @ClassName: LogAspect
 * @Description: 日志记录AOP实现
 */
@Component
@Aspect
public class LogAspect {

  private final static Logger logger = LoggerFactory.getLogger(LogAspect.class);

  @Pointcut("execution(* com.**.**.**.controller.*.*(..))")
  public void pointcut() {
  }

  /**
   * 记录程序运行时候抛出的异常信息
   */
  @AfterThrowing(pointcut = "pointcut()", throwing = "ex")
  public void doThrowing(JoinPoint joinPoint, Exception ex) {
    HttpServletRequest request;
    try {
      request = getHttpServletRequest();
    } catch (Exception e) {
      return;
    }
    // 获取输入参数
    String queryString = request.getQueryString();
    String method = request.getMethod();
    String params = "";
    if ("get".equalsIgnoreCase(method)) {
      params = queryString;
    } else if ("post".equalsIgnoreCase(method)) {
      params = JsonUtils.getJSONString(request.getParameterMap());
    }
    String methodName = joinPoint.getSignature().getName();
    logger.error("[请求:[{}];参数:[{}];方法:[{}]发生异常,原因: ]",
        request.getRequestURI(), params, methodName, ex);
  }

  private HttpServletRequest getHttpServletRequest() {
    RequestAttributes ra = RequestContextHolder.getRequestAttributes();
    ServletRequestAttributes sra = (ServletRequestAttributes) ra;
    return sra.getRequest();
  }

  /**
   * @Title:doAround
   * @Description: 环绕触发
   */
  @Around(value = "pointcut()")
  public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
    long startTime = System.currentTimeMillis();
    HttpServletRequest request;
    HttpSession session;
    try {
      request = getHttpServletRequest();
      session = request.getSession();
    } catch (Exception e) {
      return pjp.proceed();
    }
    // 获取输入参数
    String queryString = request.getQueryString();
    String method = request.getMethod();
    String requestURI = request.getRequestURI();
    String params = "";
    if ("get".equalsIgnoreCase(method)) {
      params = queryString;
    } else if ("post".equalsIgnoreCase(method)) {
      params = JsonUtils.getJSONString(request.getParameterMap());
    }
    // 执行完方法的返回值:调用proceed()方法,就会触发切入点方法执行
    Object result = pjp.proceed();// result的值就是被拦截方法的返回值

    logger.info("[用户[{}];请求:[{}];请求方式:[{}];参数:[{}];结果:[{}]; 耗时:[{}]ms]",
        session.getAttribute(USER), requestURI, method, params,
        result, System.currentTimeMillis() - startTime);
    return result;
  }

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档