我正在使用golang编写Web应用程序.我是这门语言的新手.我试图找到在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包装器处理请求时在上下文(https://golang.org/pkg/context/)中设置它.并在我想要记录的所有地方使用此上下文.
但要实现这一点,我需要将上下文对象传递给我需要记录某些东西的所有函数.这对我来说听起来不太好,因为我正在触及所有函数的原型(即添加上下文参数).有没有更好的方法来做到这一点?像ThreadLocal对象之类的东西.它可以从线程中的任何地方访问,并使用它我们可以在任何需要的地方获取请求ID?
故意不支持相应的线程本地,因为它们经常被滥用和使用不正确.代码不应该取决于哪个goroutine执行它.它还会限制一个函数启动更多的goroutine(或者它会使事情复杂化,也会设置特定于goroutine的上下文).
相反,如果您的函数需要额外的信息(例如记录器),则必须明确地传递额外的信息.
当然,函数可能需要许多额外的信息,并且所需的东西可能随着时间的推移而改变或"增长",因此最好是为这样的额外信息创建一个包装器,并传递这个额外的包装器值.如果您需要其他信息(例如登录的用户ID或数据库连接或其他任何信息),您可以将其添加到包装器中,而不必更改任何签名.
这个包装器是一个参数,还是你的包装器的函数方法(因此包装器将是接收器)完全取决于你,并且只是一个实现细节.
查看相关问题:
| 归档时间: |
|
| 查看次数: |
1104 次 |
| 最近记录: |