У нас есть прямой, а также индивидуальный способ регистрации запросов и ответов фиктивных клиентов (включая время ответа). Мы должны внедрить bean-компонент feign.Logger.Level, вот и все.
- СПОСОБ ПО УМОЛЧАНИЮ/ПРЯМОЙ СПОСОБ
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.BASIC;
}
доступны уровни ведения журнала BASIC,FULL,HEADERS,NONE (по умолчанию) подробнее
Вышеупомянутая инъекция bean-компонента даст вам регистрацию запроса и ответа feign в следующем формате:
ЗАПРОС:
ссылка
log(configKey, "---> %s %s HTTP/1.1", request.httpMethod().name(), request.url());
ex:2019-09-26 12:50:12.163 [DEBUG] [http-nio-4200-exec-5] [com.sample.FeignClient:72] [FeignClient#getUser] ---> END HTTP (0-byte body)
где configkey
означает FeignClientClassName#FeignClientCallingMethodName
например: ApiClient#apiMethod
.
ОТВЕТ
ссылка
log(configKey, "<--- HTTP/1.1 %s%s (%sms)", status, reason, elapsedTime);
ex:2019-09-26 12:50:12.163 [DEBUG] [http-nio-4200-exec-5] [com.sample.FeignClient:72] [FeignClient#getUser] <--- HTTP/1.1 200 OK (341ms)
elapsedTime
— это время ответа на вызов API.
ПРИМЕЧАНИЕ. Если вы предпочитаете способ ведения журнала фиктивного клиента по умолчанию, то мы также должны учитывать базовый уровень ведения журнала приложения, поскольку ведение журнала класса feign.Slf4jLogger
с фиктивным запросом и подробностями ответа с уровнем DEBUG
(ссылка) . Если базовый уровень ведения журнала выше DEBUG, вам может потребоваться указать явный регистратор для пакета/класса ведения журнала feign
, иначе он не будет работать.
- ПОЛЬЗОВАТЕЛЬСКИЙ СПОСОБ Если вы предпочитаете ведение журнала в собственном формате, вы можете расширить класс
feign.Logger
и настроить ведение журнала. Для типичного примера, если я хочу регистрировать сведения о заголовке запроса и ответа в одной строке в виде списка (по умолчанию Logger.Level.HEADERS печатает заголовок в несколько строк):
package com.test.logging.feign;
import feign.Logger;
import feign.Request;
import feign.Response;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import static feign.Logger.Level.HEADERS;
@Slf4j
public class customFeignLogger extends Logger {
@Override
protected void logRequest(String configKey, Level logLevel, Request request) {
if (logLevel.ordinal() >= HEADERS.ordinal()) {
super.logRequest(configKey, logLevel, request);
} else {
int bodyLength = 0;
if (request.requestBody().asBytes() != null) {
bodyLength = request.requestBody().asBytes().length;
}
log(configKey, "---> %s %s HTTP/1.1 (%s-byte body) %s", request.httpMethod().name(), request.url(), bodyLength, request.headers());
}
}
@Override
protected Response logAndRebufferResponse(String configKey, Level logLevel, Response response, long elapsedTime)
throws IOException {
if (logLevel.ordinal() >= HEADERS.ordinal()) {
super.logAndRebufferResponse(configKey, logLevel, response, elapsedTime);
} else {
int status = response.status();
Request request = response.request();
log(configKey, "<--- %s %s HTTP/1.1 %s (%sms) %s", request.httpMethod().name(), request.url(), status, elapsedTime, response.headers());
}
return response;
}
@Override
protected void log(String configKey, String format, Object... args) {
log.debug(format(configKey, format, args));
}
protected String format(String configKey, String format, Object... args) {
return String.format(methodTag(configKey) + format, args);
}
}
также мы должны внедрить bean-компонент класса customFeignLogger
@Bean
public customFeignLogger customFeignLogging() {
return new customFeignLogger();
}
Если вы собираете FeignClient самостоятельно, вы можете собрать его с помощью настроенного регистратора:
Feign.builder().logger(new customFeignLogger()).logLevel(Level.BASIC).target(SomeFeignClient.class,"http://localhost:8080");
person
Prasanth Rajendran
schedule
29.09.2019