JAVA统一接口日志切面打印方法参数

package com.gaara.musicscore.config.log;


import com.alibaba.fastjson.JSON;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.ui.Model;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

@Aspect
@Component
public class WebLogAspect {

    private Logger logger = LoggerFactory.getLogger(getClass());
    private final String httpStartTime = "HTTP_START_TIME";

    @Pointcut("execution(public * com.gaara.musicscore.api..*.*(..))")
    public void webLog() {
    }

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        try {
            if (!logger.isDebugEnabled()) {
                return;
            }
            // 接收到请求,记录请求内容
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            if (attributes == null) {
                return;
            }
            HttpServletRequest request = attributes.getRequest();
            request.setAttribute(httpStartTime, System.currentTimeMillis());

            StringBuilder sb = new StringBuilder(1000);
            sb.append("\n-----------------------------开始调用:-----------------------------\n");
            sb.append("Controller: ").append(joinPoint.getSignature().getDeclaringType()).append("\n");
            sb.append("Method    : ").append(joinPoint.getSignature().getName()).append("\n");
            sb.append("Header    : {").append("\n");
            Enumeration<String> requestHeader = request.getHeaderNames();
            while (requestHeader.hasMoreElements()) {
                String headerKey = requestHeader.nextElement();
                // 打印所有Header值
                sb.append("    ").append(headerKey).append(" : ").append(request.getHeader(headerKey)).append("\n");
            }
            sb.append("}").append("\n");
            sb.append("Params    : ").append(getParams(joinPoint)).append("\n");
            sb.append("URI       : ").append(request.getMethod()).append(" ").append(request.getRequestURI()).append("\n");
            sb.append("-----------------------------开始调用:-----------------------------");
            // 记录下请求内容
            logger.debug(sb.toString());
        } catch (Exception e) {
            logger.warn("切面处理前错误", e);
        }
    }

    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(JoinPoint joinPoint, Object ret) throws Throwable {
        try {
            if (!logger.isDebugEnabled()) {
                return;
            }
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            if (attributes == null) {
                return;
            }
            HttpServletRequest request = attributes.getRequest();
            long ms = System.currentTimeMillis() - (long) request.getAttribute(httpStartTime);
            // 处理完请求,返回内容
            StringBuilder sb = new StringBuilder(50);
            sb.append("\n-----------------------------结束调用:-----------------------------\n");
            sb.append("Controller: ").append(joinPoint.getSignature().getDeclaringType()).append("\n");
            sb.append("URI       : ").append(request.getMethod()).append(" ").append(request.getRequestURI()).append("\n");
            sb.append("Method    : ").append(joinPoint.getSignature().getName()).append("\n");
            sb.append("return    : ").append(JSON.toJSONString(ret)).append("\n");
            sb.append("CostTime  : ").append(ms).append("ms\n");
            sb.append("-----------------------------结束调用:-----------------------------");
            logger.debug(sb.toString());
        } catch (Exception e) {
            logger.warn("切面处理后错误", e);
        }

    }

    private StringBuilder getParams(JoinPoint joinPoint) {
        StringBuilder params = new StringBuilder();
        for (Object arg : joinPoint.getArgs()) {
            try {
                if (!(arg instanceof ServletRequest)
                        && !(arg instanceof ServletResponse)
                        && !(arg instanceof MultipartFile)
                        && !(arg instanceof ModelAndView)
                        && !(arg instanceof Model)
                ) {
                    params.append(", ");
                    params.append(JSON.toJSONString(arg));
                }
            } catch (Exception e) {
                logger.warn("未知类型转换错误:" + arg.getClass().getSimpleName());
            }
        }
        return params;
    }

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值