背景
spring cloud netfix组件中,feign相关的日志默认是不会输出的,需要自定义配置才能输出,并且Feign只对Debug基本的日志做出响应, 实际业务需要输出Info级别的日志,所以需要做自定义配置,覆盖相关配置Bean。
Feign配置
Feign客户端可以配置各种的Logger.Level对象,告诉Feign记录哪些日志。Logger.Level的值有以下选择。
打印Feign日志
1、Feign的配置类
根据Feign配置的描述,需要将Logger.Level 配置到客户端中:
@Configuration
public class FeignClientConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
2、在客户端中修改@FeignClient注解
@FeignClient(name = "qex-comsrv", fallback = ComsrvHystrix.class, configuration = { FeignClientConfig.class })
public abstract interface ComsrvFeignApi{
@RequestMapping({"/otp/esgMsg/send.do"})
public abstract JSONObject send(OTPRequest otprequest); }
3、修改客户端的日志打印级别
因为feign只对日志级别为debug级别做出响应,所以如果需要打印出日志,还需要修改客户端的日志级别在application.properties中要设定一行这样的配置:
logging.level.<你的feign client全路径类名>: DEBUG
操作完成这三步骤,当调用Send 方法的时候就会打印出Debug级别的日志。
打印Info级别日志
在实际生产环境中,我们常常需要使用Info级别日志,使用上述针对对每个客户端的配置进行修改,那样将会有大量的配置。所以,需要将修改Feign的日志,对Info级别进行相应。
1、重写feign.logger类
public class QjxFeignLogger extends feign.Logger { private final Logger logger; public QjxFeignLogger() {
this(feign.Logger.class);
} public QjxFeignLogger(Class<?> clazz) {
this(LoggerFactory.getLogger(clazz));
} public QjxFeignLogger(String name) {
this(LoggerFactory.getLogger(name));
} QjxFeignLogger(Logger logger) {
this.logger = logger;
} @Override
protected void logRequest(String configKey, Level logLevel, Request request) {
if (logger.isInfoEnabled()) {
super.logRequest(configKey, logLevel, request);
}
} @Override
protected Response logAndRebufferResponse(String configKey, Level logLevel, Response response, long elapsedTime)
throws IOException {
if (logger.isInfoEnabled()) {
return super.logAndRebufferResponse(configKey, logLevel, response, elapsedTime);
}
return response;
} @Override
protected void log(String configKey, String format, Object... args) {
// Not using SLF4J's support for parameterized messages (even though it
// would be more efficient) because it would
// require the incoming message formats to be SLF4J-specific.
if (logger.isInfoEnabled()) {
logger.info(String.format(methodTag(configKey) + format, args));
}
}
}
自定义一个Logger类,继承Feign.Logger,将代码中的Debug修改成为Info
2、自定义Logger类加入配置
@Configuration
public class FeignClientConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
} @Bean
Logger QjxFeign(){
return new QjxFeignLogger();
}
}
将自定义Logger类加入到Feign客户端配置的Config中,这样Feign系统间调用就能打印出Info级别的日志。
总结
打印出Feign系统间调用Info级别的日志,核心的思想是Spring Boot项目中,能够自定义配置,自定义的配置优先级大于默认的配置。详情参见Spring Boot自定义配置。