记录一次webflux请求耗时与日志打印的学习,直接上代码
没有导入任何外部的包,直接拷贝导项目中即可使用
@Component
public class LogRequestResponseDataFilter implements WebFilter {
private Logger logger = LoggerFactory.getLogger(getClass());
private final DataBufferFactory dataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
long startTime = System.currentTimeMillis();
// 记录请求开始时间
//重写当前请求,打印请求返回参数,并统计接口耗时
return chain.filter(exchange.mutate().request(new ServerHttpRequestDecorator(exchange.getRequest()) {
@Override
public MultiValueMap<String, String> getQueryParams() {
log("request ", super.getQueryParams().toString());
return super.getQueryParams();
}
@Override
public Flux<DataBuffer> getBody() {
return super.getBody().map(dataBuffer -> dataBufferFactory.wrap(logDataBuffer("request ", dataBuffer)));
}
}).response(new ServerHttpResponseDecorator(exchange.getResponse()) {
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
return super.writeWith(logPublisher(body));
}
public Publisher<? extends DataBuffer> logPublisher(Publisher<? extends DataBuffer> body) {
if (body instanceof Flux) {
return ((Flux<? extends DataBuffer>) body).map(dataBuffer -> bufferFactory().wrap(logDataBuffer("response", dataBuffer)));
} else if (body instanceof Mono) {
return ((Mono<? extends DataBuffer>) body).map(dataBuffer -> bufferFactory().wrap(logDataBuffer("response", dataBuffer)));
}
return body;
}
@Override
public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) {
Publisher<? extends Publisher<? extends DataBuffer>> newBody = body;
if (body instanceof Flux) {
newBody = ((Flux<? extends Publisher<? extends DataBuffer>>) body).map(publisher -> logPublisher(publisher));
} else if (body instanceof Mono) {
newBody = ((Mono<? extends Publisher<? extends DataBuffer>>) body).map(publisher -> logPublisher(publisher));
}
return super.writeAndFlushWith(newBody);
}
}).build()).doOnSuccess(aVoid -> logger.info("{}总耗时:{}", exchange.getLogPrefix(), (System.currentTimeMillis() - startTime)));
}
private byte[] logDataBuffer(String prefix, DataBuffer dataBuffer) {
byte[] content = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(content);
DataBufferUtils.release(dataBuffer);
String contentStr = new String(content, Charset.forName("UTF-8"));
log(prefix, contentStr);
return content;
}
private void log(String prefix, String contentStr) {
logger.info("{}:{}", prefix, contentStr);
}
}
版权声明:本文为weixin_38390086原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。