修改日志打印

This commit is contained in:
2025-07-09 01:53:44 +08:00
parent ea56ebf756
commit 09d5667f71

View File

@ -30,39 +30,11 @@ public class LoggingGlobalFilter implements GlobalFilter, Ordered {
@Override @Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 包装请求体 // 创建一个同时装饰 request 和 response 的 exchange
RequestBodyLogExchange requestLogExchange = new RequestBodyLogExchange(exchange); ServerWebExchange decoratedExchange = new ServerWebExchangeDecorator(exchange) {
// 包装响应体
ResponseBodyLogExchange responseLogExchange = new ResponseBodyLogExchange(exchange);
return chain.filter(requestLogExchange)
.then(Mono.fromRunnable(() -> {
String requestBody = requestLogExchange.getRequestBody();
String responseBody = responseLogExchange.getResponseBody();
log.info("🌐 请求路径: {}", exchange.getRequest().getPath());
log.info("📥 请求头: {}", exchange.getRequest().getHeaders());
log.info("📥 请求体: {}", requestBody);
log.info("🔚 响应状态: {}", exchange.getResponse().getStatusCode());
log.info("📤 响应内容: {}", responseBody);
}));
}
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE; // 最后执行
}
/**
* 请求体拦截装饰器
*/
static class RequestBodyLogExchange extends ServerWebExchangeDecorator {
private final StringBuilder requestBody = new StringBuilder(); private final StringBuilder requestBody = new StringBuilder();
private final StringBuilder responseBody = new StringBuilder();
public RequestBodyLogExchange(ServerWebExchange delegate) {
super(delegate);
}
@Override @Override
public ServerHttpRequest getRequest() { public ServerHttpRequest getRequest() {
@ -74,31 +46,13 @@ public class LoggingGlobalFilter implements GlobalFilter, Ordered {
buffer.read(bytes); buffer.read(bytes);
String chunk = new String(bytes, StandardCharsets.UTF_8); String chunk = new String(bytes, StandardCharsets.UTF_8);
requestBody.append(chunk); requestBody.append(chunk);
DataBufferUtils.release(buffer); // 释放原始 buffer DataBufferUtils.release(buffer);
return buffer.factory().wrap(bytes); // 返回新的 buffer return buffer.factory().wrap(bytes);
}); });
} }
}; };
} }
public String getRequestBody() {
return requestBody.toString();
}
}
/**
* 响应体拦截装饰器(适配 Spring Boot 2.3.x
*/
static class ResponseBodyLogExchange extends ServerWebExchangeDecorator {
private final StringBuilder responseBody = new StringBuilder();
private final ServerWebExchange exchange; // 显式保存 exchange 引用
public ResponseBodyLogExchange(ServerWebExchange delegate) {
super(delegate);
this.exchange = delegate;
}
@Override @Override
public ServerHttpResponse getResponse() { public ServerHttpResponse getResponse() {
return new ServerHttpResponseDecorator(super.getResponse()) { return new ServerHttpResponseDecorator(super.getResponse()) {
@ -109,15 +63,12 @@ public class LoggingGlobalFilter implements GlobalFilter, Ordered {
return super.writeWith(fluxBody.map(buffer -> { return super.writeWith(fluxBody.map(buffer -> {
byte[] content = new byte[buffer.readableByteCount()]; byte[] content = new byte[buffer.readableByteCount()];
buffer.read(content); buffer.read(content);
DataBufferUtils.release(buffer); // 释放原始 buffer DataBufferUtils.release(buffer);
String responseStr = new String(content, StandardCharsets.UTF_8); String responseStr = new String(content, StandardCharsets.UTF_8);
responseBody.append(responseStr); responseBody.append(responseStr);
// ✅ 使用外部传入的 exchange 来设置 attribute return buffer.factory().wrap(content);
exchange.getAttributes().put("responseBody", responseStr);
return buffer.factory().wrap(content); // 返回新 buffer
})); }));
} }
return super.writeWith(body); return super.writeWith(body);
@ -125,8 +76,33 @@ public class LoggingGlobalFilter implements GlobalFilter, Ordered {
}; };
} }
public String getRequestBody() {
return requestBody.toString();
}
public String getResponseBody() { public String getResponseBody() {
return responseBody.toString(); return responseBody.toString();
} }
};
return chain.filter(decoratedExchange)
.then(Mono.fromRunnable(() -> {
log.info("🌐 请求路径: {}", exchange.getRequest().getPath());
log.info("📥 请求头: {}", exchange.getRequest().getHeaders());
log.info("📥 请求体: {}", ((CustomExchange) decoratedExchange).getRequestBody());
log.info("🔚 响应状态: {}", exchange.getResponse().getStatusCode());
log.info("📤 响应内容: {}", ((CustomExchange) decoratedExchange).getResponseBody());
}));
}
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE; // 最后执行
}
// 自定义接口用于获取 body 内容
private interface CustomExchange extends ServerWebExchange {
String getRequestBody();
String getResponseBody();
} }
} }