3 回答
TA贡献2080条经验 获得超4个赞
在谷歌,我们要求 Go 程序员将 Context 参数作为第一个参数传递给传入和传出请求之间的调用路径上的每个函数。
TL;DR - 传递上下文很好,但最好的方法是什么?
有两种主要模式
询问上下文给你一个记录器
为记录器提供上下文
上下文可用于存储值:
context.WithValue(ctx, someKey, someValue)
这意味着我们可以这样做:
somepackage.Log(ctx).Info("hello world") // or sompackage.Info(ctx, "hello world")
这两个示例 API 的实现可以与上下文交互以检索所需的值,而无需担心任何日志调用站点的 MDC 中的额外信息。
TA贡献1824条经验 获得超6个赞
在我这边,我发现使用默认的日志包我们可以将前缀设置为log.SetPrefix(traceId),这样做,日志将打印跟踪 ID 作为实际和子函数/结构中的前缀。
import (
"log"
"github.com/google/uuid"
)
func (hdl *HTTPHandler) example() {
var traceId string = uuid.NewString()
log.SetPrefix(traceId + " - ")
log.SetFlags(log.LstdFlags)
// ...
// ...
log.Println("......")
}
TA贡献1820条经验 获得超2个赞
这个问题也可以使用依赖注入容器来解决。
我们可以实现“请求范围”注入,因此,对于每个请求,我们将重新创建所有使用请求范围依赖项的依赖树(记录器、错误报告器、通过上下文传播将请求发送到另一个服务的客户端)。
但据我所知,使用依赖注入容器并不是最佳实践,也不是“惯用”方式。
此外,这种方法可能会有一些性能和内存问题,因为我们将为每个请求重新创建对象。
- 3 回答
- 0 关注
- 549 浏览
添加回答
举报