我所有的路由都使用 Gorilla mux。现在我的应用程序工作正常,我想找到一种方法将我的所有响应代码记录到 - 例如 - statds。我找到了这个包:https://godoc.org/github.com/gorilla/handlers#LoggingHandler https://godoc.org/github.com/gorilla/handlers#LoggingHandler
这允许我将所有响应输出为 apache 格式。虽然这很好,但这并不是 100% 我想要的。我只想extract
响应状态并将其发送到各州。现在实现这一目标的最佳/最简单方法是什么?
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 访问日志输出到 stdout,而是希望能够使用响应代码“做某事”。我还创建了一个简单的存储库,其中包含我的示例代码。你可以找到它here https://github.com/rogierlommers/mux-status-handler.
I found 这篇有用的博客文章 https://ndersson.me/post/capturing_status_code_in_net_http/来自蒂姆·安德森。
首先,他构建了一个满足接口的新结构:
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))
})
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)