|
|
@@ -0,0 +1,95 @@
|
|
|
+package net.yyc.common.log;
|
|
|
+
|
|
|
+import cn.hutool.core.io.IoUtil;
|
|
|
+import cn.hutool.core.net.NetUtil;
|
|
|
+import cn.hutool.core.util.CharsetUtil;
|
|
|
+import net.yyc.common.log.config.LogConfig;
|
|
|
+import net.yyc.common.log.vo.LogMessage;
|
|
|
+import feign.Client;
|
|
|
+import feign.Request;
|
|
|
+import feign.Response;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Objects;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Feign客户端调用日志输出
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+public class FeignDefaultRequestLogging extends Client.Default {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 请求EVENT
|
|
|
+ */
|
|
|
+ private static final String LOG_EVENT = "FEIGN";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 打印日志开关
|
|
|
+ */
|
|
|
+ private boolean enable;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * body最大长度
|
|
|
+ */
|
|
|
+ private int maxLength;
|
|
|
+
|
|
|
+ public FeignDefaultRequestLogging(LogConfig logConfig) {
|
|
|
+ super(null, null);
|
|
|
+ this.enable = logConfig.isRequestFeignEnable();
|
|
|
+ this.maxLength = logConfig.getRequestMaxLength();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Response execute(Request request, Request.Options options) throws IOException {
|
|
|
+ if (!enable) {
|
|
|
+ return super.execute(request, options);
|
|
|
+ }
|
|
|
+
|
|
|
+ long startTime = System.currentTimeMillis();
|
|
|
+
|
|
|
+ Response response = super.execute(request, options);
|
|
|
+
|
|
|
+ //拼接日志
|
|
|
+ LogMessage logMsg = new LogMessage();
|
|
|
+ logMsg.setEvent(LOG_EVENT);
|
|
|
+ logMsg.setMethod(request.httpMethod().name());
|
|
|
+ logMsg.setRequestUri(request.url());
|
|
|
+ logMsg.setIp(NetUtil.getLocalhostStr());
|
|
|
+ logMsg.setReqHeaders(assembleHeaders(request.headers()));
|
|
|
+
|
|
|
+ byte[] reqBody = request.body();
|
|
|
+ if (Objects.nonNull(reqBody)) {
|
|
|
+ logMsg.setReqBody(new String(reqBody, 0, Math.min(reqBody.length, maxLength), CharsetUtil.CHARSET_UTF_8));
|
|
|
+ }
|
|
|
+ logMsg.setHttpStatus(response.status());
|
|
|
+ logMsg.setRespHeaders(assembleHeaders(response.headers()));
|
|
|
+
|
|
|
+ Response.Body responseBody = response.body();
|
|
|
+ if (responseBody != null) {
|
|
|
+ byte[] respBody = IoUtil.readBytes(responseBody.asInputStream());
|
|
|
+ logMsg.setRespBody(new String(respBody, 0, Math.min(respBody.length, maxLength), CharsetUtil.CHARSET_UTF_8));
|
|
|
+ response = response.toBuilder().body(respBody).build();
|
|
|
+ }
|
|
|
+ logMsg.setDuration(System.currentTimeMillis() - startTime);
|
|
|
+ log.info(logMsg.buildMessage());
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String assembleHeaders(Map<String, Collection<String>> headers) {
|
|
|
+ if (CollectionUtils.isEmpty(headers)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+
|
|
|
+ for (Map.Entry<String, Collection<String>> entrySet : headers.entrySet()) {
|
|
|
+ String key = entrySet.getKey();
|
|
|
+ Collection<String> values = entrySet.getValue();
|
|
|
+ sb.append(key).append("=").append(String.join(";", values)).append(LogMessage.DEFAULT_LOG_FIELD_SEPARATOR_2);
|
|
|
+ }
|
|
|
+ return sb.substring(0, sb.length() - 1);
|
|
|
+ }
|
|
|
+}
|