import com.xkcoding.admin.client.config.FeignThirdPartyLogger;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfiguration {
@Bean
public FeignThirdPartyLogger createMyLogger() {
return new FeignThirdPartyLogger();
}
@Bean
public Logger.Level level() { return Logger.Level.FULL; }
}
import feign.Logger;
import feign.Request;
import feign.Response;
import feign.Util;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import static feign.Util.decodeOrDefault;
import static feign.Util.valuesOrEmpty;
@Slf4j
public class FeignThirdPartyLogger extends Logger {
@Override
protected void logRequest(String configKey, Level logLevel, Request request) {
log(configKey, "---> %s %s HTTP/1.1", request.httpMethod().name(), request.url());
if (logLevel.ordinal() >= Level.HEADERS.ordinal()) {
for (String field : request.headers().keySet()) {
for (String value : valuesOrEmpty(request.headers(), field)) {
log(configKey, "%s: %s", field, value);
}
}
int bodyLength = 0;
if (request.body() != null) {
bodyLength = request.length();
if (logLevel.ordinal() >= Level.FULL.ordinal()) {
String bodyText =
request.charset() != null
? new String(request.body(), request.charset())
: null;
log(configKey, ""); // CRLF
log(configKey, "%s", bodyText != null ? bodyText : "Binary data");
}
}
log(configKey, "---> END HTTP (%s-byte body)", bodyLength);
}
}
@Override
protected Response logAndRebufferResponse(String configKey,
Level logLevel,
Response response,
long elapsedTime) throws IOException {
String reason =
response.reason() != null && logLevel.compareTo(Level.NONE) > 0 ? " " + response.reason()
: "";
int status = response.status();
log(configKey, "<--- HTTP/1.1 %s%s (%sms)", status, reason, elapsedTime);
if (logLevel.ordinal() >= Level.HEADERS.ordinal()) {
for (String field : response.headers().keySet()) {
for (String value : valuesOrEmpty(response.headers(), field)) {
log(configKey, "%s: %s", field, value);
}
}
int bodyLength = 0;
if (response.body() != null && !(status == 204 || status == 205)) {
// HTTP 204 No Content "...response MUST NOT include a message-body"
// HTTP 205 Reset Content "...response MUST NOT include an entity"
if (logLevel.ordinal() >= Level.FULL.ordinal()) {
log(configKey, ""); // CRLF
}
byte[] bodyData = Util.toByteArray(response.body().asInputStream());
bodyLength = bodyData.length;
if (logLevel.ordinal() >= Level.FULL.ordinal() && bodyLength > 0) {
log(configKey, "%s", decodeOrDefault(bodyData, Util.UTF_8, "Binary data"));
}
log(configKey, "<--- END HTTP (%s-byte body)", bodyLength);
return response.toBuilder().body(bodyData).build();
} else {
log(configKey, "<--- END HTTP (%s-byte body)", bodyLength);
}
}
return response;
}
@Override
protected void log(String configKey, String format, Object... args) {
log.info(String.format(methodTag(configKey) + format, args));
}
}
以上配置会对所有的feign生效,如果只想对指定的feign生效,还有下面的方法可以配置
第二张方式完全不需要以上的任何代码,只需要配置文件里面配置就行
feign.client.config.default.logger-level=full
logging.level.xxxxx=debug feign所在的包
就这么简单
2024-04-09 17:19:16.525 DEBUG 34304 --- [nio-8001-exec-3] c.x.admin.server.client.ClientFeign : [ClientFeign#test2] ---> GET http://client/demo/test2?gender=MAN HTTP/1.1
2024-04-09 17:19:16.525 DEBUG 34304 --- [nio-8001-exec-3] c.x.admin.server.client.ClientFeign : [ClientFeign#test2] ---> END HTTP (0-byte body)
2024-04-09 17:19:16.528 DEBUG 34304 --- [nio-8001-exec-3] c.x.admin.server.client.ClientFeign : [ClientFeign#test2] <--- HTTP/1.1 200 (2ms)
2024-04-09 17:19:16.528 DEBUG 34304 --- [nio-8001-exec-3] c.x.admin.server.client.ClientFeign : [ClientFeign#test2] connection: keep-alive
2024-04-09 17:19:16.528 DEBUG 34304 --- [nio-8001-exec-3] c.x.admin.server.client.ClientFeign : [ClientFeign#test2] content-type: application/json
2024-04-09 17:19:16.528 DEBUG 34304 --- [nio-8001-exec-3] c.x.admin.server.client.ClientFeign : [ClientFeign#test2] date: Tue, 09 Apr 2024 09:19:16 GMT
2024-04-09 17:19:16.528 DEBUG 34304 --- [nio-8001-exec-3] c.x.admin.server.client.ClientFeign : [ClientFeign#test2] keep-alive: timeout=60
2024-04-09 17:19:16.528 DEBUG 34304 --- [nio-8001-exec-3] c.x.admin.server.client.ClientFeign : [ClientFeign#test2] transfer-encoding: chunked
2024-04-09 17:19:16.528 DEBUG 34304 --- [nio-8001-exec-3] c.x.admin.server.client.ClientFeign : [ClientFeign#test2]
2024-04-09 17:19:16.528 DEBUG 34304 --- [nio-8001-exec-3] c.x.admin.server.client.ClientFeign : [ClientFeign#test2] {"id":"111111111111","num":123123123,"gender":{"name":"MAN","value":"男","_class":"cnum"}}
2024-04-09 17:19:16.528 DEBUG 34304 --- [nio-8001-exec-3] c.x.admin.server.client.ClientFeign : [ClientFeign#test2] <--- END HTTP (126-byte body)