在Golang中,我們可以使用context
包和log
包來實現請求鏈路的追蹤。以下是一個簡單的示例,展示了如何在Golang中使用context
和log
包來追蹤請求鏈路:
Key
類型,用于在context
中存儲請求鏈路信息。package main
import (
"context"
"log"
"net/http"
)
type key int
const (
traceIDKey key = iota
)
func traceMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
traceID := generateTraceID()
ctx := context.WithValue(r.Context(), traceIDKey, traceID)
next.ServeHTTP(w, r.WithContext(ctx))
})
}
func generateTraceID() string {
// 這里可以使用任何生成唯一ID的方法,例如UUID或者時間戳+隨機數等。
return "trace-id"
}
Logger
類型,它包含一個log.Logger
實例,并添加了一個traceID
字段。type Logger struct {
*log.Logger
traceID string
}
func (l *Logger) Println(v ...interface{}) {
log.SetPrefix(l.traceID + " ")
l.Logger.Println(v...)
}
Logger
類型來記錄日志。func handler(w http.ResponseWriter, r *http.Request) {
logger := &Logger{
Logger: log.Default(),
traceID: r.Context().Value(traceIDKey).(string),
}
logger.Println("Handling request")
// ...
}
func main() {
http.Handle("/", traceMiddleware(http.HandlerFunc(handler)))
log.Fatal(http.ListenAndServe(":8080", nil))
}
現在,當您運行此程序并訪問http://localhost:8080/
時,您將在日志中看到每個請求的鏈路ID。這有助于您在分布式系統中追蹤請求鏈路。