add a new middleware - Logger

This commit is contained in:
Dawid Wysokiński 2021-03-06 10:33:47 +01:00
parent 6251cacded
commit 9f881aba1d
2 changed files with 88 additions and 14 deletions

View File

@ -0,0 +1,66 @@
package middleware
import (
"fmt"
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
)
var timeFormat = "02/Jan/2006:15:04:05 -0700"
// Logger is the logrus logger handler
func Logger(logger logrus.FieldLogger) gin.HandlerFunc {
return func(c *gin.Context) {
// other handler can change c.Path so:
path := c.Request.URL.Path
start := time.Now()
c.Next()
stop := time.Since(start)
statusCode := c.Writer.Status()
clientIP := c.ClientIP()
clientUserAgent := c.Request.UserAgent()
referer := c.Request.Referer()
dataLength := c.Writer.Size()
if dataLength < 0 {
dataLength = 0
}
entry := logger.WithFields(logrus.Fields{
"statusCode": statusCode,
"latency": stop.String(), // time to process
"clientIP": clientIP,
"method": c.Request.Method,
"path": path,
"referer": referer,
"dataLength": dataLength,
"userAgent": clientUserAgent,
})
if len(c.Errors) > 0 {
entry.Error(c.Errors.ByType(gin.ErrorTypePrivate).String())
} else {
msg := fmt.Sprintf(
"%s - [%s] \"%s %s\" %d %d \"%s\" \"%s\" (%s)",
clientIP,
time.Now().Format(timeFormat),
c.Request.Method,
path,
statusCode,
dataLength,
referer,
clientUserAgent,
stop,
)
if statusCode >= http.StatusInternalServerError {
entry.Error(msg)
} else if statusCode >= http.StatusBadRequest {
entry.Warn(msg)
} else {
entry.Info(msg)
}
}
}
}

36
main.go
View File

@ -9,6 +9,7 @@ import (
"github.com/pkg/errors"
"github.com/zdam-egzamin-zawodowy/backend/internal/db"
"github.com/zdam-egzamin-zawodowy/backend/internal/gin/middleware"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
@ -37,20 +38,7 @@ func main() {
}
logrus.Info("Database connection established")
router := gin.Default()
if mode.Get() == mode.DevelopmentMode {
router.Use(cors.New(cors.Config{
AllowOriginFunc: func(string) bool {
return true
},
AllowCredentials: true,
ExposeHeaders: []string{"X-Access-Token", "X-Refresh-Token"},
AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"},
AllowHeaders: []string{"Origin", "Content-Length", "Content-Type", "Authorization"},
AllowWebSockets: false,
}))
}
router := setupRouter()
srv := &http.Server{
Addr: ":8080",
Handler: router,
@ -86,3 +74,23 @@ func setupLogger() {
customFormatter.FullTimestamp = true
logrus.SetFormatter(customFormatter)
}
func setupRouter() *gin.Engine {
router := gin.New()
router.Use(middleware.Logger(logrus.WithField("hostname", "api")), gin.Recovery())
if mode.Get() == mode.DevelopmentMode {
router.Use(cors.New(cors.Config{
AllowOriginFunc: func(string) bool {
return true
},
AllowCredentials: true,
ExposeHeaders: []string{"Authorization"},
AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD"},
AllowHeaders: []string{"Origin", "Content-Length", "Content-Type", "Authorization"},
AllowWebSockets: false,
}))
}
return router
}