package com.web.aspect; import lombok.extern.slf4j.Slf4j; 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.MDC; import org.springframework.context.annotation.Configuration; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.*; /** */ @Slf4j @Aspect @Configuration public class LogAspect { @Pointcut("execution(* com.web.controller..*.*(..))") private void controllerAspect(){ } @Before(value = "controllerAspect()") public void invokeBefore(JoinPoint point) { String realClassName = getRealClassName(point); String traceId = UUID.randomUUID().toString().replace("-", ""); MDC.put("traceId", traceId); if (canPrintLog(point)) { log.info("invoke class: {}, execute method: {}, requestParams: {},header: {}", realClassName, getMethodName(point), getRequestParams(point),getRequestHeaderInfo()); } } @AfterReturning(pointcut = "controllerAspect()",returning="returnValue") public void invokeAfter(JoinPoint point, Object returnValue) { String realClassName = getRealClassName(point); if (canPrintLog(point)) { log.info("invoke class: {}, execute method: {}", realClassName, getMethodName(point)); } MDC.clear(); } private String getRealClassName(JoinPoint point) { return point.getTarget().getClass().getName(); } private String getMethodName(JoinPoint point) { return point.getSignature().getName(); } private List<Object> getRequestParams(JoinPoint point) { List<Object> params = new ArrayList<>(); Object[] args = point.getArgs(); for (Object arg: args) { if (arg instanceof PropertyUser) { PropertyUser obj = new PropertyUser(); PropertyUser user = (PropertyUser)arg; obj.setUserId(user.getUserId()); obj.setUserName(user.getUserName()); params.add(obj); } else { params.add(arg); } } return params; } private boolean canPrintLog(JoinPoint point) { List<String> canNotPrintLog = new ArrayList<>(); return !canNotPrintLog.contains(point.getSignature().getName()); } private Map<String,String> getRequestHeaderInfo(){ ServletRequestAttributes sra = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); HttpServletRequest request = sra.getRequest(); Enumeration<String> enumeration = request.getHeaderNames(); Map<String,String> headerMap = Maps.newHashMap(); while (enumeration.hasMoreElements()) { String name = enumeration.nextElement(); if(!"cookie".equals(name)){ headerMap.put(name,request.getHeader(name)); } } return headerMap; } }