首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gorilla mux,“捕捉”响应码的最佳方式

Gorilla mux,“捕捉”响应码的最佳方式
EN

Stack Overflow用户
提问于 2017-02-10 22:48:57
回答 3查看 5.6K关注 0票数 2

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

这使我可以将所有响应输出为apache格式。虽然这很好,但它不是我想要的100%。我只想对响应状态执行extract操作,并将它们发送给statd。现在,实现这一目标的最好/最简单的方法是什么?

代码语言:javascript
复制
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上找到它。

EN

回答 3

Stack Overflow用户

发布于 2018-05-28 20:55:40

我从Tim Andersson那里找到了this useful Blog post首先,他构建了一个满足接口的新结构:

代码语言:javascript
复制
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)
}

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

代码语言:javascript
复制
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))
    })
}
票数 5
EN

Stack Overflow用户

发布于 2017-02-11 00:52:21

这就是如何用violetear创建它,可能可以给你一个关于如何处理处理程序中的状态码的提示:

代码语言:javascript
复制
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))
}

通过使用:

代码语言:javascript
复制
cw := w.(*violetear.ResponseWriter)

您可以使用cw.Status()访问显示状态代码的violetear.ResponseWriter

票数 0
EN

Stack Overflow用户

发布于 2017-02-21 14:37:24

您可以编写自己的中间件,下面是一个非常基础的示例

代码语言:javascript
复制
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))
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42162211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档