1
0
Fork 0
httpserver/middleware/middleware.go

42 Zeilen
906 B
Go

package middleware
2021-01-09 20:39:05 +00:00
import (
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/phuslu/log"
)
// LogMiddleware is an middleware to log requests to phuslu/log
func LogMiddleware(c *gin.Context) {
var xid log.XID
var tmp interface{}
var exists bool
if tmp, exists = c.Get("xid"); !exists {
xid = log.NewXIDWithTime(time.Now().UnixNano())
c.Set("xid", xid)
} else {
xid = tmp.(log.XID)
}
defer func() {
var entry *log.Entry
int := recover()
if int != nil {
err := int.(error)
c.Header("requestid", xid.String())
c.AbortWithStatus(http.StatusInternalServerError)
entry = log.Error().Err(err).Int("statuscode", 500)
} else {
if c.Writer.Status() >= 400 {
entry = log.Error()
} else {
entry = log.Info()
}
entry = entry.Int("statuscode", c.Writer.Status())
}
entry.Int64("goroutine", log.Goid()).Xid("ID", xid).Msg("Request")
}()
c.Next()
}