|
@@ -1,16 +1,27 @@
|
|
|
package com.tzld.longarticle.recommend.server.web;
|
|
package com.tzld.longarticle.recommend.server.web;
|
|
|
|
|
|
|
|
import com.google.common.base.Stopwatch;
|
|
import com.google.common.base.Stopwatch;
|
|
|
|
|
+import com.google.common.base.Strings;
|
|
|
|
|
+import com.tzld.commons.aliyun.log.AliyunLogManager;
|
|
|
|
|
+import com.tzld.longarticle.recommend.server.util.IpUtil;
|
|
|
import com.tzld.longarticle.recommend.server.util.JSONUtils;
|
|
import com.tzld.longarticle.recommend.server.util.JSONUtils;
|
|
|
import com.tzld.longarticle.recommend.server.util.TraceUtils;
|
|
import com.tzld.longarticle.recommend.server.util.TraceUtils;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
import org.aspectj.lang.ProceedingJoinPoint;
|
|
import org.aspectj.lang.ProceedingJoinPoint;
|
|
|
import org.aspectj.lang.annotation.Around;
|
|
import org.aspectj.lang.annotation.Around;
|
|
|
import org.aspectj.lang.annotation.Aspect;
|
|
import org.aspectj.lang.annotation.Aspect;
|
|
|
import org.aspectj.lang.reflect.MethodSignature;
|
|
import org.aspectj.lang.reflect.MethodSignature;
|
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Component;
|
|
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 java.util.*;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @author dyp
|
|
* @author dyp
|
|
@@ -20,17 +31,46 @@ import java.util.concurrent.TimeUnit;
|
|
|
@Slf4j
|
|
@Slf4j
|
|
|
public class ControllerAspect {
|
|
public class ControllerAspect {
|
|
|
|
|
|
|
|
|
|
+ private final AliyunLogManager aliyunLogManager;
|
|
|
|
|
+
|
|
|
|
|
+ @Value("${aliyun.log.project:}")
|
|
|
|
|
+ private String project;
|
|
|
|
|
+ @Value("${aliyun.log.logstore.request:request-log}")
|
|
|
|
|
+ private String logStore;
|
|
|
|
|
+ @Value("${aliyun.log.topic:}")
|
|
|
|
|
+ private String topic;
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ public ControllerAspect(AliyunLogManager aliyunLogManager) {
|
|
|
|
|
+ this.aliyunLogManager = aliyunLogManager;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Around("execution(* com.tzld.longarticle.recommend.server.web..*Controller.*(..)) " +
|
|
@Around("execution(* com.tzld.longarticle.recommend.server.web..*Controller.*(..)) " +
|
|
|
- "&& !execution(* com.tzld.longarticle.recommend.server.web.HealthCheckController.ok(..))")
|
|
|
|
|
|
|
+ "&& !execution(* com.tzld.longarticle.recommend.server.web.HealthCheckController.ok(..))" +
|
|
|
|
|
+ "&& !@annotation(com.tzld.longarticle.recommend.server.annotation.NoRequestLog)")
|
|
|
public Object around(ProceedingJoinPoint pjp) throws Throwable {
|
|
public Object around(ProceedingJoinPoint pjp) throws Throwable {
|
|
|
TraceUtils.setMDC();
|
|
TraceUtils.setMDC();
|
|
|
|
|
|
|
|
String className = pjp.getTarget().getClass().getSimpleName();
|
|
String className = pjp.getTarget().getClass().getSimpleName();
|
|
|
MethodSignature signature = (MethodSignature) pjp.getSignature();
|
|
MethodSignature signature = (MethodSignature) pjp.getSignature();
|
|
|
Stopwatch stopwatch = Stopwatch.createStarted();
|
|
Stopwatch stopwatch = Stopwatch.createStarted();
|
|
|
|
|
+ long startTime = System.currentTimeMillis();
|
|
|
|
|
+
|
|
|
log.info("request className=[{}], method=[{}], param=[{}]", className, signature.getName(),
|
|
log.info("request className=[{}], method=[{}], param=[{}]", className, signature.getName(),
|
|
|
JSONUtils.toJson(pjp.getArgs()));
|
|
JSONUtils.toJson(pjp.getArgs()));
|
|
|
- Object result = pjp.proceed();
|
|
|
|
|
|
|
+
|
|
|
|
|
+ Object result;
|
|
|
|
|
+ try {
|
|
|
|
|
+ result = pjp.proceed();
|
|
|
|
|
+ } catch (Throwable e) {
|
|
|
|
|
+ long elapsedTime = System.currentTimeMillis() - startTime;
|
|
|
|
|
+ sendRequestLog(pjp, e.toString(), elapsedTime);
|
|
|
|
|
+ TraceUtils.removeMDC();
|
|
|
|
|
+ throw e;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ long elapsedTime = System.currentTimeMillis() - startTime;
|
|
|
|
|
+
|
|
|
if (result != null && result instanceof String) {
|
|
if (result != null && result instanceof String) {
|
|
|
log.info("response className=[{}], method=[{}], cost=[{}] param=[{}] result=[{}]", className,
|
|
log.info("response className=[{}], method=[{}], cost=[{}] param=[{}] result=[{}]", className,
|
|
|
signature.getName(), stopwatch.stop().elapsed(TimeUnit.MILLISECONDS),
|
|
signature.getName(), stopwatch.stop().elapsed(TimeUnit.MILLISECONDS),
|
|
@@ -41,7 +81,60 @@ public class ControllerAspect {
|
|
|
JSONUtils.toJson(pjp.getArgs()), JSONUtils.toJson(result));
|
|
JSONUtils.toJson(pjp.getArgs()), JSONUtils.toJson(result));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ sendRequestLog(pjp, JSONUtils.toJson(result), elapsedTime);
|
|
|
|
|
+
|
|
|
TraceUtils.removeMDC();
|
|
TraceUtils.removeMDC();
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ private void sendRequestLog(ProceedingJoinPoint pjp, String responseBody, long elapsedTime) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
|
|
|
|
|
+ if (attributes == null) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ HttpServletRequest request = attributes.getRequest();
|
|
|
|
|
+
|
|
|
|
|
+ String query = request.getQueryString();
|
|
|
|
|
+ String uri = request.getRequestURI();
|
|
|
|
|
+ String url = Strings.isNullOrEmpty(query) ? uri : uri + "?" + query;
|
|
|
|
|
+
|
|
|
|
|
+ if (StringUtils.isNotBlank(url) && url.contains("/test")) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, Object> logMap = new HashMap<>(8);
|
|
|
|
|
+ logMap.put("url", url);
|
|
|
|
|
+ logMap.put("method", request.getMethod());
|
|
|
|
|
+ logMap.put("header", getHeaders(request));
|
|
|
|
|
+ logMap.put("elapsedTime", String.valueOf(elapsedTime));
|
|
|
|
|
+ logMap.put("clientIp", IpUtil.getIpAddr(request));
|
|
|
|
|
+ logMap.put("requestBody", getRequestBody(pjp.getArgs()));
|
|
|
|
|
+ logMap.put("traceId", Strings.nullToEmpty(TraceUtils.currentTraceId()));
|
|
|
|
|
+ logMap.put("responseBody", responseBody);
|
|
|
|
|
+
|
|
|
|
|
+ aliyunLogManager.sendLog(project, logStore, topic, logMap);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("log report request error", e);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private Object getRequestBody(Object[] args) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ if (args == null || args.length == 0) {
|
|
|
|
|
+ return "";
|
|
|
|
|
+ }
|
|
|
|
|
+ return JSONUtils.toJson(args[0]);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ return args;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String getHeaders(HttpServletRequest request) {
|
|
|
|
|
+ return Collections.list(request.getHeaderNames())
|
|
|
|
|
+ .stream()
|
|
|
|
|
+ .collect(Collectors.toMap(
|
|
|
|
|
+ name -> name,
|
|
|
|
|
+ request::getHeader)).toString();
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|