通過中間件攔截請求并包裝ResponseWriter,可記錄方法、路徑、IP、狀態(tài)碼和耗時。1. 定義LoggingMiddleware捕獲請求前后信息;2. 自定義responseWriter獲取狀態(tài)碼;3. 集成到mux路由;4. 可選slog輸出結(jié)構(gòu)化日志。
在Go語言項目中實現(xiàn)請求日志收集,核心是通過中間件機制攔截HTTP請求,記錄關(guān)鍵信息如請求路徑、方法、耗時、客戶端IP、響應(yīng)狀態(tài)碼等。以下是一個結(jié)構(gòu)清晰、實用的實現(xiàn)方式。
Go的net/http包支持中間件模式,可以在處理請求前后插入日志邏輯。
定義一個日志中間件函數(shù),包裝原有的http.Handler:
func LoggingMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() // 記錄客戶端IP clientIP := r.RemoteAddr if ip := r.Header.Get("X-Real-IP"); ip != "" { clientIP = ip } else if ip = r.Header.Get("X-Forwarded-For"); ip != "" { clientIP = strings.Split(ip, ",")[0] } // 包裝ResponseWriter以捕獲狀態(tài)碼 rw := &responseWriter{ResponseWriter: w, statusCode: http.StatusOK} // 調(diào)用下一個處理器 next.ServeHTTP(rw, r) // 日志輸出 log.Printf( "%s %s %s %d %v", r.Method, r.URL.Path, clientIP, rw.statusCode, time.Since(start), ) }) }
原生http.ResponseWriter不提供獲取狀態(tài)碼的方法,需自定義包裝類型:
立即學(xué)習(xí)“go語言免費學(xué)習(xí)筆記(深入)”;
type responseWriter struct { http.ResponseWriter statusCode int } func (rw *responseWriter) WriteHeader(code int) { rw.statusCode = code rw.ResponseWriter.WriteHeader(code) }
這樣就能在中間件中準(zhǔn)確記錄實際返回的狀態(tài)碼,即使發(fā)生內(nèi)部錯誤也能捕獲。
將日志中間件應(yīng)用到路由上:
func main() { mux := http.NewServeMux() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World!") }) // 使用中間件包裹處理器 loggedMux := LoggingMiddleware(mux) log.Println("Server starting on :8080") http.ListenAndServe(":8080", loggedMux) }
每次請求都會輸出類似日志:
GET / 127.0.0.1:54321 200 123.456μs
可結(jié)合log/slog(Go 1.21+)輸出JSON格式日志,便于收集分析:
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) logger.Info("request", "method", r.Method, "path", r.URL.Path, "ip", clientIP, "status", rw.statusCode, "duration_ms", time.Since(start).Milliseconds(), )
也可將日志寫入文件或發(fā)送到ELK、Loki等日志系統(tǒng)。
基本上就這些。通過中間件加ResponseWriter包裝,能干凈地實現(xiàn)完整的請求日志收集,不影響業(yè)務(wù)邏輯,也易于擴展。
以上就是Golang如何實現(xiàn)請求日志收集的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進(jìn)程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號