1、日志工具类
public class GatewayLogUtil {
public static void doLog(ServerHttpRequest request, Logger logger, Integer status) {
JsonLog info = new JsonLog();
Long runStartTime = ServerHttpRequestUtil.getStartTimeFromHeader(request);
String runRequestId = ServerHttpRequestUtil.getRequestIdFromHeader(request);
String runForwardedFor = ServerHttpRequestUtil.getForwardedForFromHeader(request);
String runRequestIp = ServerHttpRequestUtil.getRequestIpFromHeader(request);
info.setRequestIP(runRequestIp);
info.setRequestId(runRequestId);
if (StringUtils.isNotEmpty(runForwardedFor)) {
info.addRequestHeader(RequestHeaderKey.HEADER_FORWARDED_FOR, runForwardedFor);
}
if(request.getHeaders() != null){
info.addRequestHeader("hearders", request.getHeaders().toString());
}
info.setRequestUrl(request.getURI().getRawPath());
if (runStartTime != null) {
info.setKeyword("executeTimeFilterWithDurationMs1");
info.setRequestDurationMs(SystemClock.currentTimeMillis() - runStartTime);
} else {
info.setKeyword("executeTimeFilterWithoutDurationMs1");
}
if (status != null) {
info.setResponseStatus(status);
}
JsonLogUtil.info(logger, info);
}
}
2、ServerHttp请求工具类
@Slf4j
public class ServerHttpRequestUtils {
public static final String DEFAULT_IP = "127.0.0.1";
public static final String COMMA = ",";
public static String getAndSetRequestIpFromHeader(ServerHttpRequest serverHttpRequest) {
String url = serverHttpRequest.getPath().pathWithinApplication().value();
String requestIp1 = serverHttpRequest.getHeaders().getFirst("x-Original-Forwarded-For");
String requestIp2 = serverHttpRequest.getHeaders().getFirst("x-Forwarded-For");
serverHttpRequest.mutate().header("X-Request-IP", StringUtils.isEmpty(requestIp2)?DEFAULT_IP:ServerHttpRequestUtils.initIp(requestIp2)).build();
log.info("xRequestIp: url:{} requestIp1:{} requestIp2:{}", url, requestIp1, requestIp2);
log.info("xRequestParam param:{}", serverHttpRequest.getHeaders().toString());
return "requestIp";
}
public static String initIp(String requestIp){
if (StringUtils.isEmpty(requestIp)){
return null;
}
return requestIp.split(COMMA)[0];
}
}
3、gateway自定义日志过滤器
@Component
public class ExecuteTimeFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpRequestUtil.getAndSetRequestIdFromHeader(request);
// ServerHttpRequestUtil.getAndSetRequestIpFromHeader(request);
ServerHttpRequestUtil.setStartTime(request, SystemClock.currentTimeMillis());
ServerHttpRequestUtils.getAndSetRequestIpFromHeader(request);
return chain.filter(exchange).then(Mono.fromRunnable(() -> GatewayLogUtil.doLog(exchange.getRequest(), log, null)));
}
@Override
public int getOrder() {
return -200;
}
}