儲存協程上下文的 RequestID

quantum發表於2019-07-08

https://github.com/quanhengzhuang/requestid

本工具可以在 go 協程中維持一個不變的 requestID,以便能在記錄日誌時獲取到這個 ID,將整個請求的的日誌串起來,方便追蹤問題。

雖然使用 context 可以達到同樣的目的,但是這會要求所有的方法增加 context 引數,如果只用來傳遞這個 ID,成本過高,在實際工程中很痛苦。

本工具並未提供一個具體的 requestID 生成方法,可以使用類似 uuid 的演算法,或類似 snowflake 的演算法。

一般可以在 http 的 middleware 中Set,在 logger 中 Get。如果請求中開了新的 goroutine,還可以繼續 Set。

以下是在一個 goroutine 中使用示例:

import (
    "github.com/ncfwx/x/requestid"
)

go func() {
    requestid.Set("my-request-id")
    defer requestid.Delete()

    func() {
        requestid.Get()
    }()
}()

相關文章