在Golang中,我們可以使用context
包和第三方日志庫(如logrus
或zap
)來實現請求追蹤。下面是一個簡單的示例,展示了如何在Golang中使用context
和logrus
實現請求追蹤。
首先,確保已經安裝了logrus
庫:
go get github.com/sirupsen/logrus
然后,創建一個簡單的HTTP服務器,使用context
傳遞請求ID,并在日志中記錄請求ID:
package main
import (
"context"
"fmt"
"net/http"
"time"
"github.com/sirupsen/logrus"
)
const requestIDKey = "requestID"
func main() {
logrus.SetFormatter(&logrus.JSONFormatter{})
logrus.SetReportCaller(true)
http.HandleFunc("/", handleRequest)
logrus.Info("Server started on port 8080")
http.ListenAndServe(":8080", nil)
}
func handleRequest(w http.ResponseWriter, r *http.Request) {
requestID := generateRequestID()
ctx := context.WithValue(r.Context(), requestIDKey, requestID)
logrus.WithFields(logrus.Fields{
"requestID": requestID,
}).Info("Handling request")
start := time.Now()
defer func() {
logrus.WithFields(logrus.Fields{
"requestID": requestID,
"duration": time.Since(start),
}).Info("Finished handling request")
}()
// 模擬處理請求
time.Sleep(100 * time.Millisecond)
fmt.Fprintln(w, "Hello, World!")
}
func generateRequestID() string {
return fmt.Sprintf("%d", time.Now().UnixNano())
}
在這個示例中,我們為每個請求生成一個唯一的請求ID,并將其存儲在context
中。然后,我們在處理請求的開始和結束時記錄日志,包括請求ID和處理持續時間。
要查看請求追蹤日志,可以運行此程序并訪問http://localhost:8080
。日志將顯示每個請求的ID和處理時間。
這只是一個簡單的示例,實際應用中可能需要更復雜的追蹤功能,例如分布式追蹤。在這種情況下,可以考慮使用像jaeger-client-go
這樣的庫來實現更高級的追蹤功能。