【问题标题】:Feign client log level intervene with pdf binary contentFeign客户端日志级别干预pdf二进制内容
【发布时间】:2020-07-22 07:20:46
【问题描述】:
目前低于日志级别的 pdf 文件正在正确下载
logging:
level:
root: ${SERVER_LOG_LEVEL:INFO}
com:
abc:
feign: DEBUG
但以下一个配置文件已损坏
logging:
level:
root: ${SERVER_LOG_LEVEL:INFO}
com:
abc:
feign: INFO
【问题讨论】:
标签:
spring
spring-boot
java-8
feign
【解决方案1】:
Feign 日志只响应 DEBUG 级别。
对于每个 Feign 客户端,默认会创建一个记录器。
我们可以为每个客户端配置的 Logger.Level 表示要记录多少:
@Configuration
public class ClientConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.BASIC;
}
}
有四种日志记录级别可供选择:
- NONE – 不记录,这是默认设置
- BASIC – 仅记录请求方法、URL 和响应状态
- HEADERS - 将基本信息与请求和响应标头一起记录
- FULL - 记录请求和响应的正文、标头和元数据
请阅读更多内容:https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html
【解决方案2】:
不确定这是否与您遇到的问题相同,但我们看到的症状完全相同:假装文件下载,在调试模式下工作,在 info/warn/error 下不工作。
在调试模式下,feign 的 Logger.logAndRebufferResponse() 会在某个时刻被调用,读取响应的有效负载并将其重新打包成一个带有 ByteArrayInputStream 有效负载的新响应。
另外,我们有一个自定义的HttpMessageConverter;事实证明,它永远无法正常用于文件下载,因为 inputStream 在关闭之前没有被完全读取(它在SynchronousMethodHandler.executeAndDecode() 结束时被关闭)。它只是“起作用”,因为将日志级别设置为调试,feign 的Logger 神奇地单独进行重新打包,作为请求/响应日志记录的一部分。通过将输入流重新打包为ByteArrayInputStream 来修复自定义HttpMessageConverter 对我们有用。