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 }