前言
工作中我们有些生产问题出现在微服务 OpenFeign
的互相调用中,然而 OpenFeign
的调用默认是不打日志的。这给我们线上排查问题带来很大的阻力。
开启 OpenFeign 日志
我们还是选择使用配置类开启日志打印
@Configuration
public class FeignLoggerConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
复制代码
level
有四个等级
NONE
不打日志,默认值BASIC
只记录 method、url、响应码,执行时间HEADERS
只记录请求和响应的 headerFULL
全部都记录
我们可以查看一下 FULL 等级时的日志效果。
可以看到日志内容相对来说还是很详细的,大体上是满足了线上排查 bug 的需求。
值得注意的是 Feign 的日志级别默认是 debug ,所以我们要配置 FeignClient
包的日志级别
logging:
level:
com.feign.test.client.ProductClient: DEBUG
复制代码
但它是专门用于 OpenFeign
的跨服务调用,不太方便能和我们系统内部的业务日志结合,于是我们可以引入另一个组件 logbook
。
logbook 简介
很多人可能没有接触过 logbook
,但它的确是一个很好用的日志框架。引用官网的介绍
Logbook 是一个可扩展的 Java 库,可以为不同的客户端和服务器端技术启用完整的请求和响应日志记录。它通过以下方式满足了特殊需求:
- 允许 Web 应用程序开发人员记录应用程序接收或发送的任何 HTTP 流量 ,这意味着只要是 HTTP 请求它都可以选择记录日志
- 以一种易于持久化和分析的方式。这对于传统的日志分析、满足审计要求或调查个别历史流量问题非常有用。
具体介绍可以参考 logbook 官网
Feign.Logger
只是 Feign
组件中一个小功能,而 logbook
是一个专业的日志处理框架,很明显它们没有可比性。下面我们来感受一下 logbook
组件,它的功能要强大的多。
使用 logbook
logbook
官方提供了 logbook-spring-boot-starter
,引入依赖
implementation("org.zalando:logbook-okhttp:2.5.0")
implementation ("org.zalando:logbook-spring-boot-starter:2.5.0")
复制代码
logbook
需要配置日志级别为 TRACE
,application.yml 中
logging:
level:
org.zalando.logbook: TRACE
复制代码
然后写个测试接口,我们可以看到日志
{
"origin": "remote", #remote 代表远程请求,local 代表本地发出的请求 例如 Feign
"type": "request",
"correlation": "b2b2b8e449d7b650", #请求唯一id
"protocol": "HTTP/1.1",
"remote": "0:0:0:0:0:0:0:1",
"method": "GET",
"uri": "http://localhost:8080/consumer",
"headers": {
"accept": ["text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,appli