import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* Feign日志切面
* @version 1.0
*/
@Aspect
@Component
@Slf4j
public class FeignLogAspect {
private ThreadLocal<Map<String,Object>> feignContext = new ThreadLocal<>();
private Object get(String key){
if (feignContext.get() == null) {
return null;
}
return feignContext.get().get(key);
}
private void set(String key, Object value){
if (feignContext.get() == null) {
feignContext.set(new HashMap<>(5));
}
feignContext.get().put(key, value);
}
private void remove() {
feignContext.remove();
}
@Pointcut("execution(* com.gaara.demo.feign.*.*(*))")
public void pointcut(){}
@Before("pointcut()")
public void doBefore(JoinPoint jp) {
try {
Object[] args = jp.getArgs();
StringBuilder sb = new StringBuilder();
if (args != null && args.length > 0) {
if (args.length == 1) {
Object arg = args[0];
if (!(arg instanceof String || arg instanceof Integer || arg instanceof Long
|| arg instanceof Boolean || arg instanceof Date || arg instanceof LocalDate
|| arg instanceof Double || arg instanceof Float)) {
sb.append(JSONObject.toJSONString(arg));
} else {
sb.append("Param").append(0).append("=").append(arg.toString());
}
} else {
for (int i = 0; i < args.length; i++) {
Object arg = args[i];
sb.append("Param").append(i).append("=").append(arg.toString());
if ( i < args.length -1) {
sb.append(",");
}
}
}
}
log.info("请求参数:{}", sb.toString());
// set("createdDate", LocalDateTime.now());
// set("reqData", sb.toString());
} catch (Exception ex) {
log.warn("日志切面错误:", ex);
}
}
@AfterReturning(returning = "ret", pointcut = "pointcut()")
public void retLog(JoinPoint joinPoint, Object ret) {
try {
log.info("返回参数:{}", JSONObject.toJSONString(ret));
//LocalDateTime createdDate = (LocalDateTime) get("createdDate");
//LocalDateTime updatedDate = LocalDateTime.now();
//Duration duration = Duration.between(createdDate, updatedDate);
//long millis = duration.toMillis();
//log.info("耗时:{}ms", millis);
} catch (Exception ex) {
log.warn("日志切面错误",ex );
} finally {
// 移除线程局部变量
//remove();
}
}
}