4 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
這種方法是可行的。
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))
})
}

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
使用內(nèi)格羅尼。它的工作原理與@huangapple 的答案相同,但處理程序?qū)嶋H上實(shí)現(xiàn)了所有接口。
import (
"github.com/urfave/negroni"
)
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 := negroni.NewResponseWriter(w)
wrappedHandler.ServeHTTP(lrw, req)
statusCode := lrw.Status()
log.Printf("<-- %d %s", statusCode, http.StatusText(statusCode))
})
}

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
長(zhǎng)話短說,您應(yīng)該自己包裝 http.ResponseWriter 或使用庫(kù)。如果你想自己實(shí)現(xiàn)它,你可以從Negroni源代碼中找到一些提示

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊
在我的例子中,我不使用外部庫(kù),我不想包裝http.ResponseWriter. 我必須在請(qǐng)求的上下文中添加響應(yīng)的狀態(tài),以便以后在日志記錄中使用。所以我創(chuàng)建了一個(gè)小幫手來同時(shí)在 ResponseWriter 和請(qǐng)求的上下文中寫入狀態(tài)。
type AppContext string
var StatusCode = AppContext("statuCode")
func WriteHeaderAndContext(w http.ResponseWriter, statusCode int, r *http.Request) {
ctx := context.WithValue(r.Context(), StatusCode, statusCode)
*r = *(r.WithContext(ctx))
w.WriteHeader(statusCode)
}
在日志記錄中,我將值檢索為
r.Context().Value(StatusCode)
缺點(diǎn)發(fā)生在被叫方,看起來有點(diǎn)不尋常。例如
WriteHeaderAndContext(w, http.StatusCreated, r)
我們通常做的地方
w.WriteHeader(http.StatusCreated)
- 4 回答
- 0 關(guān)注
- 342 瀏覽
添加回答
舉報(bào)