瀏覽代碼

增加traceId和请求参数的打印

humuyu 3 年之前
父節點
當前提交
612f658899

+ 110 - 0
eladmin-logging/src/main/java/me/zhengjie/aspect/LogRequestParam.java

@@ -0,0 +1,110 @@
+package me.zhengjie.aspect;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import lombok.extern.slf4j.Slf4j;
+
+
+import org.apache.commons.lang3.StringUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.Signature;
+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.aspectj.lang.reflect.CodeSignature;
+import org.slf4j.MDC;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.UUID;
+
+@Slf4j
+@Aspect
+@Component
+public class LogRequestParam {
+	
+
+	@Pointcut("execution(* me.zhengjie.application.*.controller..*.*(..))")
+	public void pointCut() {
+	}
+
+	
+
+	@Before(value = "pointCut()")
+	public void doBefore(JoinPoint joinPoint) {
+		try {
+
+			ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder
+					.getRequestAttributes();
+			if (Objects.isNull(servletRequestAttributes)) {
+				return;
+			}
+			HttpServletRequest request = servletRequestAttributes.getRequest();
+			
+			String ip = request.getRemoteAddr();
+
+			String uri = request.getRequestURI();
+
+			Object[] parameterValues = joinPoint.getArgs();
+			int parameterValuesLength = parameterValues.length;
+			if (parameterValuesLength == 0) {
+				log.debug("[请求参数] - 无");
+				return;
+			}
+			Signature signature = joinPoint.getSignature();
+			if (Objects.isNull(signature)) {
+				return;
+			}
+			String[] parameterNames = ((CodeSignature) signature).getParameterNames();
+			if (Objects.isNull(parameterNames) || parameterNames.length != parameterValuesLength) {
+				return;
+			}
+
+			Map<String, Object> params = new HashMap<>(4);
+			for (int i = 0; i < parameterNames.length; i++) {
+				Object o = parameterNames[i];
+				if (o instanceof MultipartFile || o instanceof MultipartFile[] || o instanceof HttpServletRequest
+						|| o instanceof HttpServletResponse) {
+					continue;
+				}
+				params.put(parameterNames[i], parameterValues[i]);
+			}
+			Object[] obj = { ip, uri, JSON.toJSONString(params, SerializerFeature.WriteMapNullValue) };
+			log.info("[request] - ip: {} , requestUrl: {} ,param: {} ", obj);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+	}
+
+	@AfterReturning(returning = "result", pointcut = "pointCut() ")
+	public void doAfterReturning(Object result) {
+		try {
+			ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder
+					.getRequestAttributes();
+			if (Objects.isNull(servletRequestAttributes)) {
+				return;
+			}
+			HttpServletResponse response = servletRequestAttributes.getResponse();
+			if (Objects.isNull(response)) {
+				return;
+			}
+			int status = response.getStatus();
+			HttpServletRequest request = servletRequestAttributes.getRequest();
+
+			String uri = request.getRequestURI();
+			Object obj[] = { status, uri, JSON.toJSONString(result, SerializerFeature.WriteMapNullValue) };
+			log.info("[reponse] - status: {} , url:{} ,result:{}", obj);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}

+ 13 - 22
eladmin-security/src/main/java/me/zhengjie/security/security/TokenFilter.java

@@ -25,6 +25,8 @@ import me.zhengjie.base.ResultCode;
 import me.zhengjie.security.config.bean.SecurityProperties;
 import me.zhengjie.security.service.OnlineUserService;
 import me.zhengjie.security.service.dto.OnlineUserDto;
+
+import org.slf4j.MDC;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.GrantedAuthority;
@@ -51,7 +53,7 @@ public class TokenFilter extends GenericFilterBean {
 	private final SecurityProperties properties;
 	private final OnlineUserService onlineUserService;
 	private static Set<String> anonymousUrl = new HashSet<>();
-
+	private static final String TRACE_ID = "traceId";
 	/**
 	 * @param tokenProvider     Token
 	 * @param properties        JWT
@@ -62,7 +64,10 @@ public class TokenFilter extends GenericFilterBean {
 		this.onlineUserService = onlineUserService;
 		this.tokenProvider = tokenProvider;
 	}
+	public static String uuid() {
 
+		return UUID.randomUUID().toString().replace("-", "");
+	}
 	/**
 	 * 设置匿名访问URL
 	 * @param map
@@ -97,13 +102,11 @@ public class TokenFilter extends GenericFilterBean {
 
 		// 判断是否是app请求
 		String reqUrl = httpServletRequest.getRequestURI();
-		// 先判断是否为前端登录
-//		if (reqUrl.contains("/app/login")) {
-//			filterChain.doFilter(servletRequest, servletResponse);
-//			return;
-//		}
-
-
+		String traceId = httpServletRequest.getHeader(TRACE_ID);
+		if (StringUtils.isEmpty(traceId)) {
+			traceId = uuid();
+		}
+		MDC.put(TRACE_ID, traceId);
 		// 这里是处理app的接口
 		String token = resolveToken(httpServletRequest);
 		if (reqUrl.startsWith("/api/bank") || reqUrl.startsWith("/app/") || reqUrl.startsWith("/minipro/")) {
@@ -135,7 +138,6 @@ public class TokenFilter extends GenericFilterBean {
 		// 这里是token的问题
 		if (StrUtil.isNotBlank(token)) {
 			OnlineUserDto onlineUserDto = null;
-//			boolean cleanUserCache = false;
 			try {
 				String onlineUser = onlineUserService.getOne(properties.getOnlineKey() + token);
 				JSONObject jsonObject = JSON.parseObject(onlineUser);
@@ -148,22 +150,10 @@ public class TokenFilter extends GenericFilterBean {
 				onlineUserDto.setAuthorities(authorityList);
 			} catch (ExpiredJwtException e) {
 				log.error(e.getMessage());
-//				cleanUserCache = true;
 			} catch (Exception e) {
 				log.error(e.getMessage());
-//				cleanUserCache = true;
 			}
-			// 不理解已经是空了,为什么还要删除在线人员,
-//			finally {
-//				try {
-//					if (cleanUserCache || Objects.isNull(onlineUserDto)) {
-//						userCacheClean.cleanUserCache(
-//								String.valueOf(tokenProvider.getClaims(token).get(TokenProvider.AUTHORITIES_KEY)));
-//					}
-//				} catch (Exception e) {
-//					log.error(e.getMessage());
-//				}
-//			}
+
 			if (onlineUserDto != null && StringUtils.hasText(token)) {
 				Authentication authentication = new UsernamePasswordAuthenticationToken(onlineUserDto, token, new ArrayList<>());
 				SecurityContextHolder.getContext().setAuthentication(authentication);
@@ -172,6 +162,7 @@ public class TokenFilter extends GenericFilterBean {
 			}
 		}
 		filterChain.doFilter(servletRequest, servletResponse);
+		MDC.put(TRACE_ID, traceId);
 	}
 
 	/**

+ 1 - 1
eladmin-system/src/main/resources/logback-spring.xml

@@ -14,7 +14,7 @@
 	<property name="log.maxHistory" value="30" />
 	<!-- 定义日志文件 输入位置 -->
 	<springProperty scope="context" name="log.filePath" source="logging.logdir" />
-	<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss:SSS}[%thread]%-5level%logger{50}-%msg%n" />
+	<property name="log.pattern" value="%X{traceId} %d{yyyy-MM-dd HH:mm:ss:SSS}[%thread]%-5level%logger{50}-%msg%n" />
 	<property name="log.charset" value="utf-8" />
 
 	<!-- 控制台设置,控制台输出日志 -->