47 lines
882 B
Go
47 lines
882 B
Go
package middleware
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/hex"
|
|
"net/http"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/rs/zerolog/log"
|
|
"runtime/debug"
|
|
"time"
|
|
)
|
|
|
|
func RequestID(c *gin.Context) {
|
|
id := make([]byte, 8)
|
|
rand.Read(id)
|
|
reqID := hex.EncodeToString(id)
|
|
c.Writer.Header().Set("X-Request-ID", reqID)
|
|
c.Next()
|
|
}
|
|
|
|
type responseWriter struct {
|
|
http.ResponseWriter
|
|
status int
|
|
}
|
|
|
|
func (rw *responseWriter) WriteHeader(code int) {
|
|
rw.status = code
|
|
rw.ResponseWriter.WriteHeader(code)
|
|
}
|
|
|
|
func Logging(c *gin.Context) {
|
|
start := time.Now()
|
|
c.Next()
|
|
log.Info().Msgf("%s %s %d %s", c.Request.Method, c.Request.URL.Path, c.Writer.Status(), time.Since(start))
|
|
}
|
|
|
|
func Recovery(c *gin.Context) {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
log.Error().Msgf("panic: %v\n%s", err, debug.Stack())
|
|
c.AbortWithStatus(http.StatusInternalServerError)
|
|
}
|
|
}()
|
|
c.Next()
|
|
}
|