1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| package logger
import ( "os" "time"
"go.uber.org/zap" "go.uber.org/zap/zapcore" "gopkg.in/natefinch/lumberjack.v2" )
type Logger struct { sugar *zap.SugaredLogger rotator *lumberjack.Logger }
func NewLogger(logDir string) (*Logger, error) { rotator := &lumberjack.Logger{ Filename: logDir + "/app.log", MaxSize: 10, MaxBackups: 30, MaxAge: 30, Compress: true, LocalTime: true, }
encoderConfig := zapcore.EncoderConfig{ TimeKey: "time", LevelKey: "level", NameKey: "logger", CallerKey: "caller", MessageKey: "msg", StacktraceKey: "stacktrace", LineEnding: zapcore.DefaultLineEnding, EncodeLevel: zapcore.CapitalLevelEncoder, EncodeTime: customTimeEncoder, EncodeDuration: zapcore.SecondsDurationEncoder, EncodeCaller: zapcore.ShortCallerEncoder, }
writeSyncer := zapcore.NewMultiWriteSyncer( zapcore.AddSync(rotator), zapcore.AddSync(os.Stdout), )
core := zapcore.NewCore( zapcore.NewConsoleEncoder(encoderConfig), writeSyncer, zapcore.InfoLevel, )
zapLogger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
return &Logger{ sugar: zapLogger.Sugar(), rotator: rotator, }, nil }
func customTimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) { enc.AppendString(t.Format("2006-01-02 15:04:05.000")) }
func (l *Logger) Info(format string, v ...interface{}) { l.sugar.Infof(format, v...) }
func (l *Logger) Error(format string, v ...interface{}) { l.sugar.Errorf(format, v...) }
func (l *Logger) Warn(format string, v ...interface{}) { l.sugar.Warnf(format, v...) }
func (l *Logger) Close() { _ = l.sugar.Sync() if l.rotator != nil { _ = l.rotator.Close() } }
|