aop 配置 Contorller 请求日志 (springboot)

3 篇文章 0 订阅

引入maven

		<!--	fastjson	-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
        <!-- aop 依赖 -->
        <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!-- 用于日志切面中,以 json 格式打印出入参(本来使用阿里的 FASTJSON, 但是对于文件上传的接口,打印参数会报错,换为 Gson) -->
        <dependency>
         <groupId>com.google.code.gson</groupId>
         <artifactId>gson</artifactId>
         <version>2.8.5</version>
        </dependency>

创建WebLogAspect.java文件

package xxx;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author yp
 * @date 2019/2/12
 * @time 14:03
 * @discription
 **/
@Aspect
@Component
public class WebLogAspect {
  private final static Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
  /** 以 controller 包下定义的所有请求为切入点 */
          @Pointcut("execution(public * 目录.controller..*.*(..))")
  public void webLog() {}
  /**
    * 在切点之前织入
    * @param joinPoint
    * @throws Throwable
    */
          @Before("webLog()")
  public void doBefore(JoinPoint joinPoint) throws Throwable {
    // 开始打印请求日志
    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = attributes.getRequest();
    // 打印请求相关参数
    logger.info("========================================== Start ==========================================");
    // 打印请求 url
    logger.info("URL             : {}", request.getRequestURL().toString());
    // 打印 Http method
    logger.info("HTTP Method     : {}", request.getMethod());
    // 打印调用 controller 的全路径以及执行方法
    logger.info("Class Method    : {}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName());
    // 打印请求的 IP
    logger.info("IP       : {}", request.getRemoteAddr());

    //打印请求头 的 所有参数
    logger.info("Request Headers : {}", JSON.toJSONString(showHeader(request)));
    //过滤 request,response 序列化无异常
    Object[] args = joinPoint.getArgs();
    Stream<?> stream = ArrayUtils.isEmpty(args) ? Stream.empty() : Arrays.asList(args).stream();
    List<Object> logArgs = stream
            .filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse)))
            .collect(Collectors.toList());
    // 打印请求入参  直接写入参数
    logger.info("Parameter Args  : {}", JSON.toJSONString(logArgs));
    // 打印请求入参  写入request.getparameter() 的所有参数
    logger.info("Request Args    : {}", JSON.toJSONString(showParams(request)));

  }

  /**
    * 在切点之后织入
    * @throws Throwable
    */
  @After("webLog()")
  public void doAfter() throws Throwable {
    logger.info("=========================================== End ===========================================");
    // 每个请求之间空一行
    logger.info("");
  }
  /**
    * 环绕
    * @param proceedingJoinPoint
    * @return
    * @throws Throwable
    */
  @Around("webLog()")
  public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    long startTime = System.currentTimeMillis();
    Object result = proceedingJoinPoint.proceed();
    // 打印出参
    logger.info("Response Args     : {}", JSON.toJSONString(result));
    // 执行耗时
    logger.info("Time-Consuming    : {} ms", System.currentTimeMillis() - startTime);
    return result;
  }

  /*
   * 获取request中的所有getparameter的可用参数
   * @author yp
   * @date 2021/4/21 17:03
   * @param request 
   * @return java.util.Map
  */
  private Map showParams(HttpServletRequest request) {
    Map<String, String> params = new HashMap<>();
    Enumeration paramNames = request.getParameterNames();
    while (paramNames.hasMoreElements()) {
      String paramName = (String) paramNames.nextElement();
      String[] paramValues = request.getParameterValues(paramName);
      if (paramValues.length == 1) {
        if (paramValues[0].length() != 0) {
          params.put(paramName, paramValues[0]);
        }
      }
    }
    return params;
  }

  /*
   * @author yp
   * @date 2021/4/21 17:04
   * @param request 
   * @return java.util.Map
  */
  private Map showHeader(HttpServletRequest request){
    Map<String, String> headers = new HashMap<>();
    //获取所有请求头名称
    Enumeration<String> headerNames = request.getHeaderNames();
    while (headerNames.hasMoreElements()) {
      String name = headerNames.nextElement();
      //根据名称获取请求头的值
      String value = request.getHeader(name);
      headers.put(name,value);
    }
    return headers;
  }
}

application.yml

logging:
  file:
    path: D:/log/

原文地址: https://blog.csdn.net/weiwosuoai/article/details/100032090

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值