修改日志打印
This commit is contained in:
@ -30,21 +30,68 @@ 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)
|
private final StringBuilder requestBody = new StringBuilder();
|
||||||
|
private final StringBuilder responseBody = new StringBuilder();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ServerHttpRequest getRequest() {
|
||||||
|
return new ServerHttpRequestDecorator(super.getRequest()) {
|
||||||
|
@Override
|
||||||
|
public Flux<DataBuffer> getBody() {
|
||||||
|
return super.getBody().map(buffer -> {
|
||||||
|
byte[] bytes = new byte[buffer.readableByteCount()];
|
||||||
|
buffer.read(bytes);
|
||||||
|
String chunk = new String(bytes, StandardCharsets.UTF_8);
|
||||||
|
requestBody.append(chunk);
|
||||||
|
DataBufferUtils.release(buffer);
|
||||||
|
return buffer.factory().wrap(bytes);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ServerHttpResponse getResponse() {
|
||||||
|
return new ServerHttpResponseDecorator(super.getResponse()) {
|
||||||
|
@Override
|
||||||
|
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
|
||||||
|
if (body instanceof Flux) {
|
||||||
|
Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body;
|
||||||
|
return super.writeWith(fluxBody.map(buffer -> {
|
||||||
|
byte[] content = new byte[buffer.readableByteCount()];
|
||||||
|
buffer.read(content);
|
||||||
|
DataBufferUtils.release(buffer);
|
||||||
|
|
||||||
|
String responseStr = new String(content, StandardCharsets.UTF_8);
|
||||||
|
responseBody.append(responseStr);
|
||||||
|
|
||||||
|
return buffer.factory().wrap(content);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
return super.writeWith(body);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRequestBody() {
|
||||||
|
return requestBody.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getResponseBody() {
|
||||||
|
return responseBody.toString();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return chain.filter(decoratedExchange)
|
||||||
.then(Mono.fromRunnable(() -> {
|
.then(Mono.fromRunnable(() -> {
|
||||||
String requestBody = requestLogExchange.getRequestBody();
|
|
||||||
String responseBody = responseLogExchange.getResponseBody();
|
|
||||||
|
|
||||||
log.info("🌐 请求路径: {}", exchange.getRequest().getPath());
|
log.info("🌐 请求路径: {}", exchange.getRequest().getPath());
|
||||||
log.info("📥 请求头: {}", exchange.getRequest().getHeaders());
|
log.info("📥 请求头: {}", exchange.getRequest().getHeaders());
|
||||||
log.info("📥 请求体: {}", requestBody);
|
log.info("📥 请求体: {}", ((CustomExchange) decoratedExchange).getRequestBody());
|
||||||
log.info("🔚 响应状态: {}", exchange.getResponse().getStatusCode());
|
log.info("🔚 响应状态: {}", exchange.getResponse().getStatusCode());
|
||||||
log.info("📤 响应内容: {}", responseBody);
|
log.info("📤 响应内容: {}", ((CustomExchange) decoratedExchange).getResponseBody());
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,80 +100,9 @@ public class LoggingGlobalFilter implements GlobalFilter, Ordered {
|
|||||||
return Ordered.LOWEST_PRECEDENCE; // 最后执行
|
return Ordered.LOWEST_PRECEDENCE; // 最后执行
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// 自定义接口用于获取 body 内容
|
||||||
* 请求体拦截装饰器
|
private interface CustomExchange extends ServerWebExchange {
|
||||||
*/
|
String getRequestBody();
|
||||||
static class RequestBodyLogExchange extends ServerWebExchangeDecorator {
|
String getResponseBody();
|
||||||
|
|
||||||
private final StringBuilder requestBody = new StringBuilder();
|
|
||||||
|
|
||||||
public RequestBodyLogExchange(ServerWebExchange delegate) {
|
|
||||||
super(delegate);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ServerHttpRequest getRequest() {
|
|
||||||
return new ServerHttpRequestDecorator(super.getRequest()) {
|
|
||||||
@Override
|
|
||||||
public Flux<DataBuffer> getBody() {
|
|
||||||
return super.getBody().map(buffer -> {
|
|
||||||
byte[] bytes = new byte[buffer.readableByteCount()];
|
|
||||||
buffer.read(bytes);
|
|
||||||
String chunk = new String(bytes, StandardCharsets.UTF_8);
|
|
||||||
requestBody.append(chunk);
|
|
||||||
DataBufferUtils.release(buffer); // 释放原始 buffer
|
|
||||||
return buffer.factory().wrap(bytes); // 返回新的 buffer
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
public ServerHttpResponse getResponse() {
|
|
||||||
return new ServerHttpResponseDecorator(super.getResponse()) {
|
|
||||||
@Override
|
|
||||||
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
|
|
||||||
if (body instanceof Flux) {
|
|
||||||
Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body;
|
|
||||||
return super.writeWith(fluxBody.map(buffer -> {
|
|
||||||
byte[] content = new byte[buffer.readableByteCount()];
|
|
||||||
buffer.read(content);
|
|
||||||
DataBufferUtils.release(buffer); // 释放原始 buffer
|
|
||||||
|
|
||||||
String responseStr = new String(content, StandardCharsets.UTF_8);
|
|
||||||
responseBody.append(responseStr);
|
|
||||||
|
|
||||||
// ✅ 使用外部传入的 exchange 来设置 attribute
|
|
||||||
exchange.getAttributes().put("responseBody", responseStr);
|
|
||||||
|
|
||||||
return buffer.factory().wrap(content); // 返回新 buffer
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
return super.writeWith(body);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getResponseBody() {
|
|
||||||
return responseBody.toString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user