gpt4 book ai didi

Golang requestId 日志记录

转载 作者:IT王子 更新时间:2023-10-29 00:40:03 34 4
gpt4 key购买 nike

我正在使用 golang 编写一个网络应用程序。我是这种语言的新手。我试图找到在 golang webapp 中记录 requestid 的最佳方法。我决定使用 go 的日志库 ( https://golang.org/pkg/log/ ) 或 logrus ( https://github.com/sirupsen/logrus )。在我看来,这两个都不提供与 requestId 日志记录相关的任何内容。因此,为了生成 requestId 并在整个 api 流程中使用它,我现在已经采用以下方法

使用此处列出的任何一个 uid 生成库 (https://golanglibs.com/search?q=id+generator&sort=top) 生成 requestid。并在开始使用 http.Handler wrapper 处理请求时将其设置在上下文 ( https://golang.org/pkg/context/ ) 中。并在我想记录的所有地方使用这个上下文。

但要实现这一点,我需要将上下文对象传递给所有需要记录内容的函数。这对我来说听起来不太好,因为我正在接触所有函数的原型(prototype)(即添加上下文参数)。有没有更好的方法来做到这一点?类似于 ThreadLocal 对象。并且它可以从线程内的任何地方访问并使用它我们可以在任何需要的地方获取请求 ID?

最佳答案

Go 故意不支持线程局部变量的等价物,因为它们经常被滥用和不正确地使用。代码不应该依赖于哪个 goroutine 执行它。它还会限制函数启动更多的 goroutines(或者它会使事情复杂化以设置 goroutine 特定的上下文)。

相反,如果您的函数需要额外信息(例如记录器),您必须显式传递额外信息。

当然,一个函数可能需要很多额外的信息,并且所需的东西可能会随着时间的推移而改变或“增长”,所以最好是为这些额外信息创建一个包装器,并传递这个单独的额外包装器值。如果您需要其他信息(例如登录用户 ID 或数据库连接或其他任何信息),您可以简单地将其添加到包装器中,而不必更改任何签名。

这个包装器是一个参数,还是您创建包装器的函数方法(因此包装器将成为接收者)完全取决于您,并且只是一个实现细节。

查看相关问题:

Why does a goroutine have no identity

Does Go have something like ThreadLocal from Java?

关于Golang requestId 日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51720882/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com