From 4a436f490db9d743a0fba724e126de0af0ad0507 Mon Sep 17 00:00:00 2001 From: weiyachao <13526234727@126.com> Date: Tue, 8 Aug 2023 14:02:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=93=E5=8D=B0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qiuguo/iot/base/filter/LogWebFilter.java | 99 +++++++++++++++++++ .../iot/data/resp/device/DeviceBatchResp.java | 1 + .../qiuguo/iot/user/api/filter/LogFilter.java | 33 ------- 3 files changed, 100 insertions(+), 33 deletions(-) create mode 100644 iot-common/iot-base/src/main/java/com/qiuguo/iot/base/filter/LogWebFilter.java delete mode 100644 iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogFilter.java diff --git a/iot-common/iot-base/src/main/java/com/qiuguo/iot/base/filter/LogWebFilter.java b/iot-common/iot-base/src/main/java/com/qiuguo/iot/base/filter/LogWebFilter.java new file mode 100644 index 0000000..fb0ea54 --- /dev/null +++ b/iot-common/iot-base/src/main/java/com/qiuguo/iot/base/filter/LogWebFilter.java @@ -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 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 getBody() { + Flux 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 writeWith(Publisher body){ + if (body instanceof Flux) { + Flux 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 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); + } + }; + } + +} diff --git a/iot-common/iot-data/src/main/java/com/qiuguo/iot/data/resp/device/DeviceBatchResp.java b/iot-common/iot-data/src/main/java/com/qiuguo/iot/data/resp/device/DeviceBatchResp.java index bed8a8c..998db72 100644 --- a/iot-common/iot-data/src/main/java/com/qiuguo/iot/data/resp/device/DeviceBatchResp.java +++ b/iot-common/iot-data/src/main/java/com/qiuguo/iot/data/resp/device/DeviceBatchResp.java @@ -1,4 +1,5 @@ package com.qiuguo.iot.data.resp.device; +import java.math.BigDecimal; import lombok.Data; import java.util.Date; /** diff --git a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogFilter.java b/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogFilter.java deleted file mode 100644 index 3185a50..0000000 --- a/iot-modules/iot-box-user-api/src/main/java/com/qiuguo/iot/user/api/filter/LogFilter.java +++ /dev/null @@ -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 filter(ServerWebExchange exchange, WebFilterChain chain) { - // 获取请求路径和参数 - String path = exchange.getRequest().getPath().toString(); - MultiValueMap 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); // 继续请求链 - - } -}