X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=api%2Flogger.go;h=ea7266ba4fe450e4bb406afe7dee7adb693d2b86;hb=e0ab9e8caa9237d3e15193fcb0ca74954afc66be;hp=7057a3046b0dcfe2a8d6063fa80f4640630a1ec3;hpb=7a9e5112eaaea58d55f181d3e5296e4ff839921c;p=perso%2FImmae%2FProjets%2FCryptomonnaies%2FCryptoportfolio%2FFront.git diff --git a/api/logger.go b/api/logger.go index 7057a30..ea7266b 100644 --- a/api/logger.go +++ b/api/logger.go @@ -1,27 +1,78 @@ package api import ( + "fmt" + "time" + + "github.com/Sirupsen/logrus" "github.com/gin-gonic/gin" "github.com/jloup/utils" ) var log = utils.StandardL().WithField("module", "api") +func SetContextLogField(c *gin.Context, field string, value interface{}) { + itf, ok := c.Get("logFields") + var fields map[string]interface{} + if !ok { + fields = make(map[string]interface{}) + } else { + fields = itf.(map[string]interface{}) + } + + fields[field] = value + c.Set("logFields", fields) +} + func Logger() gin.HandlerFunc { return func(c *gin.Context) { path := c.Request.URL.Path rawQuery := c.Request.URL.RawQuery + start := time.Now() c.Next() - for _, err := range c.Errors { - l := log.WithField("path", path) + latency := time.Now().Sub(start).Round(10 * time.Microsecond) + code := c.Writer.Status() + + l := log + l = l.WithField("latency", latency) + l = l.WithField("client_ip", c.ClientIP()) + l = l.WithField("method", c.Request.Method) + l = l.WithField("status_code", code) - if rawQuery != "" { - l = l.WithField("query", rawQuery) + if itf, ok := c.Get("logFields"); ok { + for field, value := range itf.(map[string]interface{}) { + l = l.WithField(field, value) } + } + + if rawQuery != "" { + path = fmt.Sprintf("%s?%s", path, rawQuery) + } + + l = l.WithField("path", path) + + msgLog := fmt.Sprintf("[%v] %d %s '%s'", latency, code, c.Request.Method, path) + + var level logrus.Level + switch { + case code >= 200 && code < 400: + level = logrus.DebugLevel + case code >= 400 && code < 500: + level = logrus.InfoLevel + default: + level = logrus.ErrorLevel + } + + errors := c.Errors.ByType(gin.ErrorTypePrivate) + + for _, err := range errors { + l.WithField("description", err.Err).Logf(level, "%s: %s", msgLog, err.Err) + } - l.Errorf("%s", err.Err) + if errors == nil { + l.Logf(level, msgLog) } } }