我正在修改我们用Golang编写的小Web应用程序的日志(log).由于外部要求,日志(log)记录已被隔离在一个位置,因此我们以后可能会切换到logging server个位置.(不是我的主意-我保证.)尽管如此,我们现在可以主要使用标准库的一部分和我们传递的用户/会话 struct 来记录诸如日期/时间、行号、用户和消息之类的常见信息.

但是——问题来了——在较低级别的方法中,仅仅为了登录而访问用户名是一种浪费.所以我想找到一些其他的东西来在日志(log)文件中找到一个特定的请求.我肯定有一些明显的事情我没有想到.

到目前为止的 idea :

  • Java日志(log)框架可以打印出线程id,在这种情况下也足够了.只是在歌朗叫别的什么?
  • 以某种方式使用户/会话 struct 可以全局访问.(仍然需要传递会话id,除非有一个线程用作查找键.回到 idea 1.)
  • 放弃,无论如何都要传递用户/会话 struct .
  • 不要在最低级别记录错误,但只有在用户/会话 struct 可用时才记录错误.不过行号不会那么好.

我们正在使用大猩猩的一部分来做web的事情,除此之外,我们主要使用的是标准库.

对此有什么建议和 idea 吗?

推荐答案

由于滥用的可能性很高,因此无法在围棋中访问当前Goroutine的标识符.这看起来可能很苛刻,但这实际上保留了围棋包生态系统的一个重要属性:如果您启动一个新的goroutine来做某事,这并不重要.

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

F()

几乎完全等同于:

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

("几乎"来自这样一个事实:如果Fpanic ,panic

这也适用于日志(log)记录-如果您使用的是当前的goroutine 要推断当前用户,启动新Goroutine的任何代码 如上所述,将打破这一假设,并且您的日志(log)记录 不会包含预期的信息.

您需要传递一些上下文信息.

Go相关问答推荐

Golang regexpp:获取带有右括号的单词

Golang Cososdb-gremlin连接

Makefile:现有文件上没有这样的文件或目录,不加载环境变量

CGO如何转换为文件*类型

禁用Golang中的终端

Go SQLCMD比Windows本机版本慢吗?

golang testscript .txtar 语法,用于 stderr 或 stdout 中包含的文本

转到 bufio.Writer、gzip.Writer 并上传到内存中的 AWS S3

从给定顶点查找图形中所有闭合路径的算法

Exchange Web 服务 - 使用 soap xml 请求查找所有未读邮件

golang:解组动态 YAML 注释

go - 仅在函数即将返回错误时清理资源

使用图像解码 JPEG 时 colored颜色 不正确.解码并写入 PDF?

如何使用 go-playground/validator 编写 snake case 绑定标签?

Golang - 客户 Unmarshaler/Marshaler 在指针上具有 nil/null 值

如何使用 Go 获取 X11 中的窗口列表

Golang prometheus 显示自定义指标

为什么 go-cmp Equal() 说 struct 不是完全相等的,即使所有字段都非常相等?

在 Go 泛型中,如何对联合约束中的类型使用通用方法?

Golang 中的无实体函数