一尘不染

寻找用于记录的呼叫或线程ID

go

我正在重新整理用golang编写的小型Web应用程序的日志记录。由于外部需求,日志记录已被隔离在一个地方,因此我们以后可能会切换到 日志记录服务器
。(不是我的主意-
我保证…。)尽管如此,我们现在基本上可以使用标准库的一部分以及我们正在传递的用户/会话结构来记录日期/时间,行号,用户和消息等常见信息周围。

但是-随之而来的问题是-
在较低级别的方法中,仅为了获取日志而仅为了获取用户名而在会话中传递是浪费的。因此,我想找到其他可用于在日志文件中找到一个特定请求的东西。我敢肯定,有些明显的东西我还没想到。

到目前为止的想法:

  • Java日志记录框架可以打印出线程ID,在这种情况下也足够了。只是在golang中被称为其他东西?
  • 使用户/会话结构事物在某种程度上可以全局访问。(除非有线程可以用作查找关键字,否则仍然需要传递会话ID。回到想法1。)
  • 无论如何都要放弃并传递用户/会话结构。
  • 仅在用户/会话结构可用时才记录最低级别的错误。行号不会那么好。

我们将大猩猩的一部分用于网络事物,除此之外,大部分都是标准库。

关于此的建议和想法?


阅读 216

收藏
2020-07-02

共1个答案

一尘不染

由于滥用的可能性很高,因此无法访问Go中当前goroutine的标识符。这可能看起来很苛刻,但这实际上保留了Go软件包生态系统的重要属性:
启动新的goroutine做某事并不重要

也就是说,对于函数F的任何方法:

F()

几乎完全等同于:

done := make(chan struct{})
go func() {
   defer close(done)
   F()
}
<-done

(“几乎”来自以下事实:如果F发生恐慌,那么原始goroutine将不会抓住该恐慌)。

这也适用于日志记录-
如果您正在使用当前goroutine来推断当前用户,则如上所述启动任何新goroutine的任何代码都会破坏该假设,并且您的日志记录将不包含预期的信息。

您需要传递某种上下文。

2020-07-02