亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索

Golang如何實現(xiàn)請求日志收集

P粉602998670
發(fā)布: 2025-10-16 19:44:01
原創(chuàng)
523人瀏覽過
通過中間件攔截請求并包裝ResponseWriter,可記錄方法、路徑、IP、狀態(tài)碼和耗時。1. 定義LoggingMiddleware捕獲請求前后信息;2. 自定義responseWriter獲取狀態(tài)碼;3. 集成到mux路由;4. 可選slog輸出結(jié)構(gòu)化日志。

golang如何實現(xiàn)請求日志收集

在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),
        )
    })
}
登錄后復(fù)制

捕獲響應(yīng)狀態(tài)碼和寫入器包裝

原生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)
}
登錄后復(fù)制

這樣就能在中間件中準(zhǔn)確記錄實際返回的狀態(tài)碼,即使發(fā)生內(nèi)部錯誤也能捕獲。

PatentPal專利申請寫作
PatentPal專利申請寫作

AI軟件來為專利申請自動生成內(nèi)容

PatentPal專利申請寫作13
查看詳情 PatentPal專利申請寫作

集成到HTTP服務(wù)中

將日志中間件應(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)
}
登錄后復(fù)制

每次請求都會輸出類似日志:

GET / 127.0.0.1:54321 200 123.456μs
登錄后復(fù)制

進(jìn)階:結(jié)構(gòu)化日志與輸出控制

可結(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ù)制

也可將日志寫入文件或發(fā)送到ELK、Loki等日志系統(tǒng)。

基本上就這些。通過中間件加ResponseWriter包裝,能干凈地實現(xiàn)完整的請求日志收集,不影響業(yè)務(wù)邏輯,也易于擴展。

以上就是Golang如何實現(xiàn)請求日志收集的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!

最佳 Windows 性能的頂級免費優(yōu)化軟件
最佳 Windows 性能的頂級免費優(yōu)化軟件

每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進(jìn)程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
最新問題
開源免費商場系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號