我所有的路由都使用Gorilla mux。现在我的应用运行良好,我想找到一种方法将我所有的响应代码记录到-for example- statds中。我找到了这个包:https://godoc.org/github.com/gorilla/handlers#LoggingHandler
这使我可以将所有响应输出为apache格式。虽然这很好,但它不是我想要的100%。我只想对响应状态执行extract操作,并将它们发送给statd。现在,实现这一目标的最好/最简单的方法是什么?
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,而是希望能够对响应代码“做点什么”。我还创建了一个简单的repo,其中包含我的示例代码。你可以在here上找到它。
发布于 2018-05-28 20:55:40
我从Tim Andersson那里找到了this useful Blog post首先,他构建了一个满足接口的新结构:
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))
})
}发布于 2017-02-11 00:52:21
这就是如何用violetear创建它,可能可以给你一个关于如何处理处理程序中的状态码的提示:
package main
import (
"fmt"
"log"
"net/http"
"github.com/nbari/violetear"
)
func handleGET(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("I handle GET requests\n"))
// do anything here with the Status code
cw := w.(*violetear.ResponseWriter)
fmt.Printf("The status code is: %d\n", cw.Status())
}
func main() {
router := violetear.New()
router.HandleFunc("/", handleGET, "GET")
log.Fatal(http.ListenAndServe(":8080", router))
}通过使用:
cw := w.(*violetear.ResponseWriter)您可以使用cw.Status()访问显示状态代码的violetear.ResponseWriter
发布于 2017-02-21 14:37:24
您可以编写自己的中间件,下面是一个非常基础的示例
package main
import (
"log"
"net/http"
"github.com/gorilla/mux"
"github.com/rogierlommers/mux-status-handler/articles"
"github.com/rogierlommers/mux-status-handler/users"
)
// middleWare ...
func middleWare(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// right not all this does is log like
// "github.com/gorilla/handlers"
log.Printf("%s %s %s", r.RemoteAddr, r.Method, r.URL)
// However since this is middleware you can have it do other things
// Examples, auth users, write to file, redirects, handle panics, ect
// add code to log to statds, remove log.Printf if you want
handler.ServeHTTP(w, r)
})
}
func main() {
r := mux.NewRouter()
r.HandleFunc("/products", articles.Handler)
r.HandleFunc("/users", users.Handler)
log.Println("listening on 8080")
http.ListenAndServe(":8080", middleWare(r))
}https://stackoverflow.com/questions/42162211
复制相似问题