From 6547ffc370ef72ed8e04decadd5a6159911b7a97 Mon Sep 17 00:00:00 2001 From: "mayur.popli" Date: Fri, 21 Mar 2025 12:19:05 +0530 Subject: [PATCH] fix: logging module comments --- pkg/log/log.go | 464 ++++++++++++++++++++++++------------------------- 1 file changed, 232 insertions(+), 232 deletions(-) diff --git a/pkg/log/log.go b/pkg/log/log.go index 6318589..8659ad4 100644 --- a/pkg/log/log.go +++ b/pkg/log/log.go @@ -1,256 +1,256 @@ - package log +package log - import ( - "context" - "errors" - "fmt" - "io" - "net/http" - "os" - "strconv" - "sync" - "time" +import ( + "context" + "errors" + "fmt" + "io" + "net/http" + "os" + "strconv" + "sync" + "time" - "github.com/rs/zerolog" - "gopkg.in/natefinch/lumberjack.v2" - ) + "github.com/rs/zerolog" + "gopkg.in/natefinch/lumberjack.v2" +) - type Level string - type DestinationType string - type Destination struct { - Type DestinationType `yaml:"type"` - Config map[string]string `yaml:"config"` +type Level string +type DestinationType string +type Destination struct { + Type DestinationType `yaml:"type"` + Config map[string]string `yaml:"config"` +} + +const ( + Stdout DestinationType = "stdout" + File DestinationType = "file" +) + +const ( + DebugLevel Level = "debug" + InfoLevel Level = "info" + WarnLevel Level = "warn" + ErrorLevel Level = "error" + FatalLevel Level = "fatal" + PanicLevel Level = "panic" +) + +var logLevels = map[Level]zerolog.Level{ + DebugLevel: zerolog.DebugLevel, + InfoLevel: zerolog.InfoLevel, + WarnLevel: zerolog.WarnLevel, + ErrorLevel: zerolog.ErrorLevel, + FatalLevel: zerolog.FatalLevel, + PanicLevel: zerolog.PanicLevel, +} + +type Config struct { + level Level `yaml:"level"` + destinations []Destination `yaml:"destinations"` + contextKeys []any `yaml:"contextKeys"` +} + +var ( + logger zerolog.Logger + cfg Config + once sync.Once +) + +var ( + ErrInvalidLogLevel = errors.New("invalid log level") + ErrLogDestinationNil = errors.New("log Destinations cant be empty") + ErrMissingFilePath = errors.New("file path missing in destination config for file logging") +) + +func (config *Config) validate() error { + if _, exists := logLevels[config.level]; !exists { + return ErrInvalidLogLevel } - const ( - Stdout DestinationType = "stdout" - File DestinationType = "file" - ) - - const ( - DebugLevel Level = "debug" - InfoLevel Level = "info" - WarnLevel Level = "warn" - ErrorLevel Level = "error" - FatalLevel Level = "fatal" - PanicLevel Level = "panic" - ) - - var logLevels = map[Level]zerolog.Level{ - DebugLevel: zerolog.DebugLevel, - InfoLevel: zerolog.InfoLevel, - WarnLevel: zerolog.WarnLevel, - ErrorLevel: zerolog.ErrorLevel, - FatalLevel: zerolog.FatalLevel, - PanicLevel: zerolog.PanicLevel, + if len(config.destinations) == 0 { + return ErrLogDestinationNil } - type Config struct { - level Level `yaml:"level"` - destinations []Destination `yaml:"destinations"` - contextKeys []any `yaml:"contextKeys"` - } + for _, dest := range config.destinations { + switch dest.Type { + case Stdout: + case File: + if _, exists := dest.Config["path"]; !exists { + return ErrMissingFilePath + } - var ( - logger zerolog.Logger - cfg Config - once sync.Once - ) - - var ( - ErrInvalidLogLevel = errors.New("invalid log level") - ErrLogDestinationNil = errors.New("log Destinations cant be empty") - ErrMissingFilePath = errors.New("file path missing in destination config for file logging") - ) - - func (config *Config) validate() error { - if _, exists := logLevels[config.level]; !exists { - return ErrInvalidLogLevel - } - - if len(config.destinations) == 0 { - return ErrLogDestinationNil - } - - for _, dest := range config.destinations { - switch dest.Type { - case Stdout: - case File: - if _, exists := dest.Config["path"]; !exists { - return ErrMissingFilePath - } - - for _, key := range []string{"maxSize", "maxBackups", "maxAge"} { - if valStr, ok := dest.Config[key]; ok { - if _, err := strconv.Atoi(valStr); err != nil { - return fmt.Errorf("invalid %s: %w", key, err) - } + for _, key := range []string{"maxSize", "maxBackups", "maxAge"} { + if valStr, ok := dest.Config[key]; ok { + if _, err := strconv.Atoi(valStr); err != nil { + return fmt.Errorf("invalid %s: %w", key, err) } } - default: - return fmt.Errorf("invalid destination type '%s'", dest.Type) } + default: + return fmt.Errorf("invalid destination type '%s'", dest.Type) } - return nil } + return nil +} - var defaultConfig = Config{ - level: InfoLevel, - destinations: []Destination{ - {Type: Stdout}, - }, - contextKeys: []any{"userID", "requestID"}, - } +var defaultConfig = Config{ + level: InfoLevel, + destinations: []Destination{ + {Type: Stdout}, + }, + contextKeys: []any{"userID", "requestID"}, +} - func init() { - logger, _ = getLogger(defaultConfig) - } +func init() { + logger, _ = getLogger(defaultConfig) +} - func getLogger(config Config) (zerolog.Logger, error) { - var newLogger zerolog.Logger - var writers []io.Writer - for _, dest := range config.destinations { - switch dest.Type { - case Stdout: - writers = append(writers, os.Stdout) - case File: - filePath := dest.Config["path"] - fmt.Printf("writing test log to file: %v\n", filePath) - lumberjackLogger := &lumberjack.Logger{ - Filename: filePath, - } - setConfigValue := func(key string, target *int) { - if valStr, ok := dest.Config[key]; ok { - if val, err := strconv.Atoi(valStr); err == nil { - *target = val - } +func getLogger(config Config) (zerolog.Logger, error) { + var newLogger zerolog.Logger + var writers []io.Writer + for _, dest := range config.destinations { + switch dest.Type { + case Stdout: + writers = append(writers, os.Stdout) + case File: + filePath := dest.Config["path"] + fmt.Printf("writing test log to file: %v\n", filePath) + lumberjackLogger := &lumberjack.Logger{ + Filename: filePath, + } + setConfigValue := func(key string, target *int) { + if valStr, ok := dest.Config[key]; ok { + if val, err := strconv.Atoi(valStr); err == nil { + *target = val } } - setConfigValue("maxSize", &lumberjackLogger.MaxSize) - setConfigValue("maxBackups", &lumberjackLogger.MaxBackups) - setConfigValue("maxAge", &lumberjackLogger.MaxAge) - if compress, ok := dest.Config["compress"]; ok { - lumberjackLogger.Compress = compress == "true" - } - Info(context.Background(),"here") - writers = append(writers, lumberjackLogger) - } - } - multiwriter := io.MultiWriter(writers...) - newLogger = zerolog.New(multiwriter). - Level(logLevels[config.level]). - With(). - Timestamp(). - Caller(). - Logger() - - cfg = config - return newLogger, nil - } - func InitLogger(c Config) error { - - if err := c.validate(); err != nil { - return err - } - - var initErr error - once.Do(func() { - - logger, initErr = getLogger(c) - }) - return initErr - } - func Debug(ctx context.Context, msg string) { - logEvent(ctx, zerolog.DebugLevel, msg, nil) - } - - func Debugf(ctx context.Context, format string, v ...any) { - msg := fmt.Sprintf(format, v...) - logEvent(ctx, zerolog.DebugLevel, msg, nil) - } - - func Info(ctx context.Context, msg string) { - logEvent(ctx, zerolog.InfoLevel, msg, nil) - } - - func Infof(ctx context.Context, format string, v ...any) { - msg := fmt.Sprintf(format, v...) - logEvent(ctx, zerolog.InfoLevel, msg, nil) - } - - func Warn(ctx context.Context, msg string) { - logEvent(ctx, zerolog.WarnLevel, msg, nil) - } - - func Warnf(ctx context.Context, format string, v ...any) { - msg := fmt.Sprintf(format, v...) - logEvent(ctx, zerolog.WarnLevel, msg, nil) - } - - func Error(ctx context.Context, err error, msg string) { - logEvent(ctx, zerolog.ErrorLevel, msg, err) - } - - func Errorf(ctx context.Context, err error, format string, v ...any) { - msg := fmt.Sprintf(format, v...) - logEvent(ctx, zerolog.ErrorLevel, msg, err) - } - - func Fatal(ctx context.Context, err error, msg string) { - logEvent(ctx, zerolog.FatalLevel, msg, err) - } - - func Fatalf(ctx context.Context, err error, format string, v ...any) { - msg := fmt.Sprintf(format, v...) - logEvent(ctx, zerolog.FatalLevel, msg, err) - } - - func Panic(ctx context.Context, err error, msg string) { - logEvent(ctx, zerolog.PanicLevel, msg, err) - } - - func Panicf(ctx context.Context, err error, format string, v ...any) { - msg := fmt.Sprintf(format, v...) - logEvent(ctx, zerolog.PanicLevel, msg, err) - } - - func logEvent(ctx context.Context, level zerolog.Level, msg string, err error) { - event := logger.WithLevel(level) - - if err != nil { - event = event.Err(err) - } - addCtx(ctx, event) - event.Msg(msg) - } - func Request(ctx context.Context, r *http.Request, body []byte) { - event := logger.Info() - addCtx(ctx, event) - event.Str("method", r.Method). - Str("url", r.URL.String()). - Str("body", string(body)). - Str("remoteAddr", r.RemoteAddr). - Msg("HTTP Request") - } - - func addCtx(ctx context.Context, event *zerolog.Event) { - for _, key := range cfg.contextKeys { - val, ok := ctx.Value(key).(string) - if !ok { - continue + setConfigValue("maxSize", &lumberjackLogger.MaxSize) + setConfigValue("maxBackups", &lumberjackLogger.MaxBackups) + setConfigValue("maxAge", &lumberjackLogger.MaxAge) + if compress, ok := dest.Config["compress"]; ok { + lumberjackLogger.Compress = compress == "true" } - keyStr := key.(string) - event.Str(keyStr, val) + Info(context.Background(), "here") + writers = append(writers, lumberjackLogger) + } } + multiwriter := io.MultiWriter(writers...) + newLogger = zerolog.New(multiwriter). + Level(logLevels[config.level]). + With(). + Timestamp(). + Caller(). + Logger() - func Response(ctx context.Context, r *http.Request, statusCode int, responseTime time.Duration) { - event := logger.Info() - addCtx(ctx, event) - event.Str("method", r.Method). - Str("url", r.URL.String()). - Int("statusCode", statusCode). - Dur("responseTime", responseTime). - Msg("HTTP Response") + cfg = config + return newLogger, nil +} +func InitLogger(c Config) error { + + if err := c.validate(); err != nil { + return err } + + var initErr error + once.Do(func() { + + logger, initErr = getLogger(c) + }) + return initErr +} +func Debug(ctx context.Context, msg string) { + logEvent(ctx, zerolog.DebugLevel, msg, nil) +} + +func Debugf(ctx context.Context, format string, v ...any) { + msg := fmt.Sprintf(format, v...) + logEvent(ctx, zerolog.DebugLevel, msg, nil) +} + +func Info(ctx context.Context, msg string) { + logEvent(ctx, zerolog.InfoLevel, msg, nil) +} + +func Infof(ctx context.Context, format string, v ...any) { + msg := fmt.Sprintf(format, v...) + logEvent(ctx, zerolog.InfoLevel, msg, nil) +} + +func Warn(ctx context.Context, msg string) { + logEvent(ctx, zerolog.WarnLevel, msg, nil) +} + +func Warnf(ctx context.Context, format string, v ...any) { + msg := fmt.Sprintf(format, v...) + logEvent(ctx, zerolog.WarnLevel, msg, nil) +} + +func Error(ctx context.Context, err error, msg string) { + logEvent(ctx, zerolog.ErrorLevel, msg, err) +} + +func Errorf(ctx context.Context, err error, format string, v ...any) { + msg := fmt.Sprintf(format, v...) + logEvent(ctx, zerolog.ErrorLevel, msg, err) +} + +func Fatal(ctx context.Context, err error, msg string) { + logEvent(ctx, zerolog.FatalLevel, msg, err) +} + +func Fatalf(ctx context.Context, err error, format string, v ...any) { + msg := fmt.Sprintf(format, v...) + logEvent(ctx, zerolog.FatalLevel, msg, err) +} + +func Panic(ctx context.Context, err error, msg string) { + logEvent(ctx, zerolog.PanicLevel, msg, err) +} + +func Panicf(ctx context.Context, err error, format string, v ...any) { + msg := fmt.Sprintf(format, v...) + logEvent(ctx, zerolog.PanicLevel, msg, err) +} + +func logEvent(ctx context.Context, level zerolog.Level, msg string, err error) { + event := logger.WithLevel(level) + + if err != nil { + event = event.Err(err) + } + addCtx(ctx, event) + event.Msg(msg) +} +func Request(ctx context.Context, r *http.Request, body []byte) { + event := logger.Info() + addCtx(ctx, event) + event.Str("method", r.Method). + Str("url", r.URL.String()). + Str("body", string(body)). + Str("remoteAddr", r.RemoteAddr). + Msg("HTTP Request") +} + +func addCtx(ctx context.Context, event *zerolog.Event) { + for _, key := range cfg.contextKeys { + val, ok := ctx.Value(key).(string) + if !ok { + continue + } + keyStr := key.(string) + event.Str(keyStr, val) + } +} + +func Response(ctx context.Context, r *http.Request, statusCode int, responseTime time.Duration) { + event := logger.Info() + addCtx(ctx, event) + event.Str("method", r.Method). + Str("url", r.URL.String()). + Int("statusCode", statusCode). + Dur("responseTime", responseTime). + Msg("HTTP Response") +}