|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- package middleware
-
- import (
- "github.com/zeromicro/go-zero/core/logx"
- "github.com/zeromicro/go-zero/rest/httpx"
- "net/http"
- "net/http/httputil"
- "strings"
- )
-
- const (
- // ApplicationJson stands for application/json.
- ApplicationJson = "application/json"
- // ContentType is the header key for Content-Type.
- ContentType = "Content-Type"
- )
-
- func LogMiddleware(next http.HandlerFunc) http.HandlerFunc {
- return func(w http.ResponseWriter, r *http.Request) {
- proxy := &responseProxy{w: w}
- requestLog(r)
- next(proxy, r)
- logx.Debug("LogMiddleware response uri:%s jsonResult :%+v", r.RequestURI, string(proxy.body))
- }
- }
-
- type responseProxy struct {
- w http.ResponseWriter
- body []byte
- }
-
- func (p *responseProxy) Header() http.Header {
- return p.w.Header()
- }
- func (p *responseProxy) Write(data []byte) (int, error) {
- p.body = append(p.body, data...)
- return p.w.Write(data)
- }
- func (p *responseProxy) WriteHeader(statusCode int) {
- p.w.WriteHeader(statusCode)
- }
-
- func requestLog(r *http.Request) {
- // 打印所有header
- logx.Debug("LogMiddleware request uri:%s header :%+v", r.RequestURI, r.Header)
- // json日志
- if withJsonBody(r) {
- requestDump, err := httputil.DumpRequest(r, true)
- logx.Debug("LogMiddleware request uri:%s jsonParams :%+v, err:%+v", r.RequestURI, string(requestDump), err)
- } else {
- // form表单日志和其他
- formParams, err := httpx.GetFormValues(r)
- logx.Debug("LogMiddleware request uri:%s formParams :%+v, err:%+v", r.RequestURI, formParams, err)
- }
- }
-
- func withJsonBody(r *http.Request) bool {
- return r.ContentLength > 0 && strings.Contains(r.Header.Get(ContentType), ApplicationJson)
- }
|