打印日志
This commit is contained in:
parent
a0a5f83734
commit
4a436f490d
@ -0,0 +1,99 @@
|
||||
package com.qiuguo.iot.base.filter;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.UUID;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.logging.log4j.ThreadContext;
|
||||
import org.reactivestreams.Publisher;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.io.buffer.DataBuffer;
|
||||
import org.springframework.core.io.buffer.DataBufferFactory;
|
||||
import org.springframework.core.io.buffer.DataBufferUtils;
|
||||
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
|
||||
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||
import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
import org.springframework.web.server.WebFilter;
|
||||
import org.springframework.web.server.WebFilterChain;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@Configuration
|
||||
@Slf4j
|
||||
public class LogWebFilter implements WebFilter {
|
||||
@Override
|
||||
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
|
||||
long startTime = System.currentTimeMillis();
|
||||
ThreadContext.put("logid", UUID.randomUUID().toString());
|
||||
ServerHttpRequest request = exchange.getRequest();
|
||||
String ip = request.getRemoteAddress().getHostName();
|
||||
String m = request.getMethod().toString();
|
||||
|
||||
log.info("api start time:{} ip:{} method:{} url:{} param:{} headers:{}",
|
||||
startTime,
|
||||
ip,
|
||||
m,
|
||||
request.getPath(),
|
||||
request.getQueryParams(),
|
||||
request.getHeaders());
|
||||
|
||||
ServerWebExchange.Builder ex = exchange.mutate();
|
||||
ex.response(getResponse(exchange));
|
||||
|
||||
if(!request.getMethod().equals(HttpMethod.GET) && !request.getMethod().equals(HttpMethod.DELETE)){
|
||||
ex.request(getRequest(exchange));
|
||||
}
|
||||
return chain.filter(ex.build()).doFinally(signalType -> {
|
||||
long endTime = System.currentTimeMillis();
|
||||
log.info("api end time:{}, total time:{}", endTime, endTime - startTime);
|
||||
ThreadContext.clearAll();
|
||||
});
|
||||
}
|
||||
|
||||
private ServerHttpRequest getRequest(ServerWebExchange exchange){
|
||||
ServerHttpRequest request = exchange.getRequest();
|
||||
return new ServerHttpRequestDecorator(request){
|
||||
@Override
|
||||
public Flux<DataBuffer> getBody() {
|
||||
Flux<DataBuffer> body = this.getDelegate().getBody();
|
||||
return body.map(dataBuffer -> {
|
||||
log.info("request:{}", dataBuffer.toString(StandardCharsets.UTF_8));
|
||||
return dataBuffer;
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private ServerHttpResponse getResponse(ServerWebExchange exchange){
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
return new ServerHttpResponseDecorator(response){
|
||||
@Override
|
||||
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body){
|
||||
if (body instanceof Flux) {
|
||||
Flux<? extends DataBuffer> fluxBody = Flux.from(body);
|
||||
return super.writeWith(fluxBody.buffer().map(dataBuffers -> {
|
||||
DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
|
||||
DataBuffer joinBuffer = dataBufferFactory.join(dataBuffers);
|
||||
byte[] returnContent = new byte[joinBuffer.readableByteCount()];
|
||||
joinBuffer.read(returnContent);
|
||||
DataBufferUtils.release(joinBuffer);
|
||||
String returnStr = new String(returnContent, StandardCharsets.UTF_8);
|
||||
log.info("response:{}", returnStr);
|
||||
return response.bufferFactory().wrap(returnContent);
|
||||
}));
|
||||
}else if(body instanceof Mono){
|
||||
Mono<DataBuffer> monoBody = Mono.from(body);
|
||||
return super.writeWith(monoBody.map(dataBuffer -> {
|
||||
log.info("response:{}", dataBuffer.toString(StandardCharsets.UTF_8));
|
||||
return response.bufferFactory().wrap(dataBuffer.toString(StandardCharsets.UTF_8).getBytes());
|
||||
}));
|
||||
}
|
||||
return super.writeWith(body);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,4 +1,5 @@
|
||||
package com.qiuguo.iot.data.resp.device;
|
||||
import java.math.BigDecimal;
|
||||
import lombok.Data;
|
||||
import java.util.Date;
|
||||
/**
|
||||
|
||||
@ -1,33 +0,0 @@
|
||||
package com.qiuguo.iot.user.api.filter;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.web.server.ServerWebExchange;
|
||||
import org.springframework.web.server.WebFilter;
|
||||
import org.springframework.web.server.WebFilterChain;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
/**
|
||||
* XXX
|
||||
*
|
||||
* @author weiyachao
|
||||
* @since 2023/8/8 10:27
|
||||
*/
|
||||
@Component
|
||||
@Slf4j
|
||||
public class LogFilter implements WebFilter {
|
||||
|
||||
@Override
|
||||
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
|
||||
// 获取请求路径和参数
|
||||
String path = exchange.getRequest().getPath().toString();
|
||||
MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
|
||||
log.info("path------{}", path);
|
||||
log.info("queryParams-------{}", queryParams);
|
||||
log.info("getMethodValue-------{}", exchange.getRequest().getMethodValue());
|
||||
log.info("headers-------{}", exchange.getRequest().getHeaders().entrySet());
|
||||
return chain.filter(exchange); // 继续请求链
|
||||
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user