gpt4 book ai didi

http - Gorilla mux, 'catch' 响应代码的最佳方式

转载 作者:IT王子 更新时间:2023-10-29 01:44:53 30 4
gpt4 key购买 nike

我的所有路由都使用 Gorilla mux。现在我的应用程序运行良好,我想找到一种方法将我所有的响应代码记录到 - 例如 - statds。我找到了这个包裹:https://godoc.org/github.com/gorilla/handlers#LoggingHandler

这允许我将所有响应输出为 apache 格式。虽然这很好,但这不是我想要的 100%。我只想提取 响应状态并将它们发送到 statds。现在实现这一目标的最佳/最简单方法是什么?

package main

import (
"log"
"net/http"
"os"

"github.com/gorilla/handlers"
"github.com/gorilla/mux"
"github.com/rogierlommers/mux-status-handler/articles"
"github.com/rogierlommers/mux-status-handler/users"
)

func main() {
r := mux.NewRouter()
r.HandleFunc("/products", articles.Handler)
r.HandleFunc("/users", users.Handler)

loggedRouter := handlers.LoggingHandler(os.Stdout, r)
log.Println("listening on 8080")
http.ListenAndServe(":8080", loggedRouter)
}

上面的代码给了我这个:

apache logformat output

所以我正在寻找类似的东西,但不是将 Apache 访问日志输出到标准输出,而是希望能够使用响应代码“做某事”。我还创建了一个简单的存储库,其中包含我的示例代码。你可以找到它here .

最佳答案

我找到了 this useful Blog post来自蒂姆·安德森。首先,他构建了一个满足接口(interface)的新结构:

type loggingResponseWriter struct {
http.ResponseWriter
statusCode int
}

func NewLoggingResponseWriter(w http.ResponseWriter) *loggingResponseWriter {
return &loggingResponseWriter{w, http.StatusOK}
}

func (lrw *loggingResponseWriter) WriteHeader(code int) {
lrw.statusCode = code
lrw.ResponseWriter.WriteHeader(code)
}

然后他将其用作包装器(或中间件):

func wrapHandlerWithLogging(wrappedHandler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
log.Printf("--> %s %s", req.Method, req.URL.Path)

lrw := NewLoggingResponseWriter(w)
wrappedHandler.ServeHTTP(lrw, req)

statusCode := lrw.statusCode
log.Printf("<-- %d %s", statusCode, http.StatusText(statusCode))
})
}

关于http - Gorilla mux, 'catch' 响应代码的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42162211/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com