1
0
mirror of https://github.com/gofiber/fiber.git synced 2025-02-22 04:13:21 +00:00

v3: fix logger benchmarks (#2074)

* v3: fix logger benchmarks

* fix datarace

* fix datarace

* fix datarace
This commit is contained in:
M. Efe Çetin 2022-09-06 18:54:39 +03:00 committed by GitHub
parent e3282f6408
commit e9db6c70d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 23 additions and 17 deletions

View File

@ -95,7 +95,7 @@ func main() {
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) 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(). log.Info().
Str("path", c.Path()). Str("path", c.Path()).
Str("method", c.Method()). 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. // If you don't define anything for this field, it'll use classical logger of Fiber.
// //
// Optional. Default: defaultLogger // Optional. Default: defaultLogger
LoggerFunc func(c fiber.Ctx, data LoggerData, cfg Config) error LoggerFunc func(c fiber.Ctx, data *LoggerData, cfg Config) error
} }
``` ```

View File

@ -51,7 +51,7 @@ type Config struct {
// If you don't define anything for this field, it'll use default logger of Fiber. // If you don't define anything for this field, it'll use default logger of Fiber.
// //
// Optional. Default: defaultLogger // 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 enableColors bool
enableLatency bool enableLatency bool

View File

@ -19,6 +19,7 @@ import (
// LoggerData is a struct to define some variables to use in custom logger function. // LoggerData is a struct to define some variables to use in custom logger function.
type LoggerData struct { type LoggerData struct {
mu sync.Mutex
Pid string Pid string
ErrPaddingStr string ErrPaddingStr string
ChainErr error ChainErr error
@ -30,9 +31,7 @@ type LoggerData struct {
var tmpl *fasttemplate.Template var tmpl *fasttemplate.Template
// default logger for fiber // default logger for fiber
func defaultLogger(c fiber.Ctx, data LoggerData, cfg Config) error { func defaultLogger(c fiber.Ctx, data *LoggerData, cfg Config) error {
var mu sync.Mutex
// Alias colors // Alias colors
colors := c.App().Config().ColorScheme colors := c.App().Config().ColorScheme
@ -185,7 +184,7 @@ func defaultLogger(c fiber.Ctx, data LoggerData, cfg Config) error {
if err != nil { if err != nil {
_, _ = buf.WriteString(err.Error()) _, _ = buf.WriteString(err.Error())
} }
mu.Lock() data.mu.Lock()
// Write buffer to output // Write buffer to output
if _, err := cfg.Output.Write(buf.Bytes()); err != nil { if _, err := cfg.Output.Write(buf.Bytes()); err != nil {
// Write error to output // 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) fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err)
} }
} }
mu.Unlock() data.mu.Unlock()
// Put buffer back to pool // Put buffer back to pool
bytebufferpool.Put(buf) bytebufferpool.Put(buf)

View File

@ -88,6 +88,7 @@ func New(config ...Config) fiber.Handler {
// Set variables // Set variables
var ( var (
mu sync.Mutex
once sync.Once once sync.Once
errHandler fiber.ErrorHandler errHandler fiber.ErrorHandler
) )
@ -99,6 +100,13 @@ func New(config ...Config) fiber.Handler {
// Before handling func // Before handling func
cfg.BeforeHandlerFunc(cfg) cfg.BeforeHandlerFunc(cfg)
// Logger data
data := &LoggerData{
Pid: pid,
ErrPaddingStr: errPaddingStr,
Timestamp: timestamp,
}
// Return new handler // Return new handler
return func(c fiber.Ctx) (err error) { return func(c fiber.Ctx) (err error) {
// Don't execute middleware if Next returns true // Don't execute middleware if Next returns true
@ -144,17 +152,16 @@ func New(config ...Config) fiber.Handler {
stop = time.Now() stop = time.Now()
} }
// Logger instance // Logger instance & update some logger data fields
if err = cfg.LoggerFunc(c, LoggerData{ mu.Lock()
Pid: pid, data.ChainErr = chainErr
ErrPaddingStr: errPaddingStr, data.Start = start
ChainErr: chainErr, data.Stop = stop
Start: start,
Stop: stop, if err = cfg.LoggerFunc(c, data, cfg); err != nil {
Timestamp: timestamp,
}, cfg); err != nil {
return err return err
} }
mu.Unlock()
return nil return nil
} }