api/internal/filter/logging.go (41 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package filter
import (
"bytes"
"time"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
)
func RequestLogHandler(logger *zap.SugaredLogger) gin.HandlerFunc {
return func(c *gin.Context) {
start, host, remoteIP, path, method := time.Now(), c.Request.Host, c.ClientIP(), c.Request.URL.Path, c.Request.Method
query := c.Request.URL.RawQuery
requestId := c.Writer.Header().Get("X-Request-Id")
blw := &bodyLogWriter{body: bytes.NewBuffer(nil), ResponseWriter: c.Writer}
c.Writer = blw
c.Next()
latency := time.Since(start) / 1000000
statusCode := c.Writer.Status()
//respBody := blw.body.String()
var errs []string
for _, err := range c.Errors {
errs = append(errs, err.Error())
}
logger.Desugar().Info(path,
//zap.String("path", path),
zap.Int("status", statusCode),
zap.String("host", host),
zap.String("query", query),
zap.String("requestId", requestId),
zap.Duration("latency", latency),
zap.String("remoteIP", remoteIP),
zap.String("method", method),
//zap.String("respBody", respBody),
zap.Strings("errs", errs),
)
}
}
type bodyLogWriter struct {
gin.ResponseWriter
body *bytes.Buffer
}
func (w bodyLogWriter) Write(b []byte) (int, error) {
w.body.Write(b)
return w.ResponseWriter.Write(b)
}