github.com/oinume/lekcije@v0.0.0-20231017100347-5b4c5eb6ab24/backend/logger/logger.go (about)

     1  package logger
     2  
     3  import (
     4  	"io"
     5  	"strings"
     6  
     7  	"go.uber.org/zap"
     8  	"go.uber.org/zap/zapcore"
     9  )
    10  
    11  func init() {
    12  	err := zap.RegisterEncoder("debug", func(encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) {
    13  		return NewConsoleEncoder(encoderConfig), nil
    14  	})
    15  	if err != nil {
    16  		panic(err)
    17  	}
    18  }
    19  
    20  func NewAccessLogger(w io.Writer) *zap.Logger {
    21  	return NewZapLogger(nil, []io.Writer{w}, zapcore.InfoLevel)
    22  }
    23  
    24  func NewAppLogger(w io.Writer, logLevel zapcore.Level) *zap.Logger {
    25  	return NewZapLogger(nil, []io.Writer{w}, logLevel)
    26  }
    27  
    28  func NewLevel(level string) zapcore.Level {
    29  	var l zapcore.Level
    30  	switch strings.ToLower(level) {
    31  	case "debug":
    32  		l = zap.DebugLevel
    33  	case "info":
    34  		l = zap.InfoLevel
    35  	case "warn":
    36  		l = zap.WarnLevel
    37  	case "error":
    38  		l = zap.ErrorLevel
    39  	case "panic":
    40  		l = zap.PanicLevel
    41  	case "fatal":
    42  		l = zap.FatalLevel
    43  	default:
    44  		l = zap.InfoLevel
    45  	}
    46  	return l
    47  }
    48  
    49  func NewZapLogger(
    50  	encoderConfig *zapcore.EncoderConfig,
    51  	writers []io.Writer,
    52  	logLevel zapcore.Level,
    53  	options ...zap.Option,
    54  ) *zap.Logger {
    55  	if encoderConfig == nil {
    56  		c := zap.NewProductionEncoderConfig()
    57  		c.EncodeTime = zapcore.ISO8601TimeEncoder
    58  		encoderConfig = &c
    59  	}
    60  	if len(writers) == 0 {
    61  		writers = append(writers, io.Discard)
    62  	}
    63  	enabler := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
    64  		return lvl >= logLevel
    65  	})
    66  	cores := make([]zapcore.Core, len(writers))
    67  	for i, w := range writers {
    68  		cores[i] = zapcore.NewCore(zapcore.NewJSONEncoder(*encoderConfig), zapcore.AddSync(w), enabler)
    69  	}
    70  	return zap.New(zapcore.NewTee(cores...), options...)
    71  }
    72  
    73  type consoleEncoder struct {
    74  	zapcore.Encoder
    75  	consoleEncoder zapcore.Encoder
    76  }
    77  
    78  func NewConsoleEncoder(cfg zapcore.EncoderConfig) zapcore.Encoder {
    79  	// TODO: import "github.com/fatih/color"
    80  	//color.NoColor = false // Force enabled
    81  
    82  	cfg.StacktraceKey = ""
    83  	cfg2 := cfg
    84  	cfg2.NameKey = ""
    85  	cfg2.MessageKey = ""
    86  	cfg2.LevelKey = ""
    87  	cfg2.CallerKey = ""
    88  	cfg2.StacktraceKey = ""
    89  	cfg2.TimeKey = ""
    90  	return consoleEncoder{
    91  		consoleEncoder: zapcore.NewConsoleEncoder(cfg),
    92  		Encoder:        zapcore.NewJSONEncoder(cfg2),
    93  	}
    94  }