我试图捕获并记录当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
没有任何区别。
答案 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?