需求背景
假设你正在参与一个后端业务系统的开发,为了方便在请求出错时排查问题,我们在编写代码的时候会在关键路径上打印日志。某个请求出错之后,我们希望能搜索出这个请求对应的所有日志,以此来查找问题的原因。而实际情况是,在日志文件中,不同请求的日志会交织在一起。如果没有东西来标识哪些日志属于同一个请求,我们就无法关联同一个请求的所有日志。
我们可以给每个请求分配一个唯一 ID,并且保存在请求的上下文(Context)中。每次打印日志的时候,我们从请求上下文中取出请求 ID,跟日志一块输出。这样,同一个请求的所有日志都包含同样的请求 ID 信息,我们就可以通过请求 ID 来搜索同一个请求的所有日志了。
一份"能用"的代码实现
type IDGenerator struct {
Logger *log.Logger
}
func (g *IDGenerator) Generate() (string, error) {
hostName, err := os.Hostname()
if err != nil {
g.Logger.Printf("id generate error: %v", err)
return "", err
}
randomCharList := make([]byte, 8, 8)
count := 0
for count < 8 {
randNum := rand.Intn(123)
if randNum >= 48 && randNum <= 57 {
randomCharList[count] = byte('0' + (randNum - 48))
count++
}