package logger import ( "fmt" "os" "time" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) type Level zapcore.Level const ( Info Level = 0 Warning Level = 1 Error Level = 2 Debug Level = -1 ) type Logger struct { log *zap.Logger debug *zap.Logger } func NewLogger(name string) (*Logger, error) { if name == "" { name = "NewLogger" } file, err := os.OpenFile(fmt.Sprintf("%s.log", name), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { return nil, err } encoderConfig := zap.NewProductionEncoderConfig() encoderConfig.TimeKey = "timestamp" encoderConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) { enc.AppendString(t.Format("2006-01-02T15:04:05.000")) } encoder := zapcore.NewJSONEncoder(encoderConfig) // Build the logger return &Logger{ log: zap.New(zapcore.NewCore(encoder, zapcore.AddSync(file), zapcore.InfoLevel)), debug: zap.New(zapcore.NewCore(encoder, zapcore.AddSync(file), zapcore.DebugLevel)), }, nil } func (l *Logger) Log(logLevel Level, caller, msg string) { switch logLevel { case Info: l.log.Info(msg, zap.String("caller", caller)) case Warning: l.log.Warn(msg, zap.String("caller", caller)) case Error: l.log.Error(msg, zap.String("caller", caller)) case Debug: l.debug.Debug(msg, zap.String("caller", caller)) } }