如何在golang中记录http服务器错误?

时间:2014-08-22 22:25:30

标签: go

我试图捕获并记录当url params编码不正确时发生的http错误400。

我的服务器实现如下:

router := http.NewServeMux()
router.HandleFunc("/", requestHandler)

s := &http.Server{
    Addr:           ":8080",
    Handler:        router,
    ErrorLog:       myLogger,
}
log.Fatal(s.ListenAndServe())

请求永远不会达到requestHandler,并且ErrorLog: myLogger没有任何区别。

2 个答案:

答案 0 :(得分:8)

您需要围绕记录StatusCode的requestHandler创建自定义包装器 在requestCall处理完毕后检查它。

注意我们如何包装主路由器本身。与WrapHandler(router)

package main

import (
    "log"
    "net/http"
)

type LogRecord struct {
    http.ResponseWriter
    status int
}

func (r *LogRecord) Write(p []byte) (int, error) {
    return r.ResponseWriter.Write(p)
}

func (r *LogRecord) WriteHeader(status int) {
    r.status = status
    r.ResponseWriter.WriteHeader(status)
}

func WrapHandler(f http.Handler) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        record := &LogRecord{
            ResponseWriter: w,
        }

        f.ServeHTTP(record, r)

        log.Println("Bad Request ", record.status)

        if record.status == http.StatusBadRequest {
            log.Println("Bad Request ", r)
        }
    }
}

func main() {
    router := http.NewServeMux()

    s := &http.Server{
        Addr:    ":8080",
        Handler: WrapHandler(router),
    }
    log.Fatal(s.ListenAndServe())
}

答案 1 :(得分:0)

对于其他发现此问题的人,您无法使用Go中的net / http来拦截400错误。有关详细信息,请参阅此答案:

How can I customize Golang http 400 responses for parse errors?