From e9db6c70d23f487a45a6a6b16040cf46e798d131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2E=20Efe=20=C3=87etin?= Date: Tue, 6 Sep 2022 18:54:39 +0300 Subject: [PATCH] v3: fix logger benchmarks (#2074) * v3: fix logger benchmarks * fix datarace * fix datarace * fix datarace --- middleware/logger/README.md | 4 ++-- middleware/logger/config.go | 2 +- middleware/logger/default_logger.go | 9 ++++----- middleware/logger/logger.go | 25 ++++++++++++++++--------- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/middleware/logger/README.md b/middleware/logger/README.md index c6b99fb6..c77d4f6a 100644 --- a/middleware/logger/README.md +++ b/middleware/logger/README.md @@ -95,7 +95,7 @@ func main() { log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) - app.Use(logger.New(logger.Config{LoggerFunc: func(c fiber.Ctx, data logger.LoggerData, cfg logger.Config) error { + app.Use(logger.New(logger.Config{LoggerFunc: func(c fiber.Ctx, data *logger.LoggerData, cfg logger.Config) error { log.Info(). Str("path", c.Path()). Str("method", c.Method()). @@ -158,7 +158,7 @@ type Config struct { // If you don't define anything for this field, it'll use classical logger of Fiber. // // Optional. Default: defaultLogger - LoggerFunc func(c fiber.Ctx, data LoggerData, cfg Config) error + LoggerFunc func(c fiber.Ctx, data *LoggerData, cfg Config) error } ``` diff --git a/middleware/logger/config.go b/middleware/logger/config.go index 80dd3288..700f2c69 100644 --- a/middleware/logger/config.go +++ b/middleware/logger/config.go @@ -51,7 +51,7 @@ type Config struct { // If you don't define anything for this field, it'll use default logger of Fiber. // // Optional. Default: defaultLogger - LoggerFunc func(c fiber.Ctx, data LoggerData, cfg Config) error + LoggerFunc func(c fiber.Ctx, data *LoggerData, cfg Config) error enableColors bool enableLatency bool diff --git a/middleware/logger/default_logger.go b/middleware/logger/default_logger.go index 41442f78..7565f3dc 100644 --- a/middleware/logger/default_logger.go +++ b/middleware/logger/default_logger.go @@ -19,6 +19,7 @@ import ( // LoggerData is a struct to define some variables to use in custom logger function. type LoggerData struct { + mu sync.Mutex Pid string ErrPaddingStr string ChainErr error @@ -30,9 +31,7 @@ type LoggerData struct { var tmpl *fasttemplate.Template // default logger for fiber -func defaultLogger(c fiber.Ctx, data LoggerData, cfg Config) error { - var mu sync.Mutex - +func defaultLogger(c fiber.Ctx, data *LoggerData, cfg Config) error { // Alias colors colors := c.App().Config().ColorScheme @@ -185,7 +184,7 @@ func defaultLogger(c fiber.Ctx, data LoggerData, cfg Config) error { if err != nil { _, _ = buf.WriteString(err.Error()) } - mu.Lock() + data.mu.Lock() // Write buffer to output if _, err := cfg.Output.Write(buf.Bytes()); err != nil { // Write error to output @@ -194,7 +193,7 @@ func defaultLogger(c fiber.Ctx, data LoggerData, cfg Config) error { fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err) } } - mu.Unlock() + data.mu.Unlock() // Put buffer back to pool bytebufferpool.Put(buf) diff --git a/middleware/logger/logger.go b/middleware/logger/logger.go index 0baa0424..98f68945 100644 --- a/middleware/logger/logger.go +++ b/middleware/logger/logger.go @@ -88,6 +88,7 @@ func New(config ...Config) fiber.Handler { // Set variables var ( + mu sync.Mutex once sync.Once errHandler fiber.ErrorHandler ) @@ -99,6 +100,13 @@ func New(config ...Config) fiber.Handler { // Before handling func cfg.BeforeHandlerFunc(cfg) + // Logger data + data := &LoggerData{ + Pid: pid, + ErrPaddingStr: errPaddingStr, + Timestamp: timestamp, + } + // Return new handler return func(c fiber.Ctx) (err error) { // Don't execute middleware if Next returns true @@ -144,17 +152,16 @@ func New(config ...Config) fiber.Handler { stop = time.Now() } - // Logger instance - if err = cfg.LoggerFunc(c, LoggerData{ - Pid: pid, - ErrPaddingStr: errPaddingStr, - ChainErr: chainErr, - Start: start, - Stop: stop, - Timestamp: timestamp, - }, cfg); err != nil { + // Logger instance & update some logger data fields + mu.Lock() + data.ChainErr = chainErr + data.Start = start + data.Stop = stop + + if err = cfg.LoggerFunc(c, data, cfg); err != nil { return err } + mu.Unlock() return nil }