// Package logger provides structured logging functionality. package logger import ( "os" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) // Logger wraps zap.Logger to provide a simpler interface. type Logger struct { *zap.SugaredLogger } // New creates a new Logger instance. func New(debug bool) *Logger { level := zapcore.InfoLevel if debug { level = zapcore.DebugLevel } encoderConfig := zapcore.EncoderConfig{ TimeKey: "time", LevelKey: "level", NameKey: "logger", CallerKey: "caller", MessageKey: "msg", StacktraceKey: "stacktrace", LineEnding: zapcore.DefaultLineEnding, EncodeLevel: zapcore.CapitalLevelEncoder, EncodeTime: zapcore.ISO8601TimeEncoder, EncodeDuration: zapcore.SecondsDurationEncoder, EncodeCaller: zapcore.ShortCallerEncoder, } core := zapcore.NewCore( zapcore.NewConsoleEncoder(encoderConfig), zapcore.Lock(os.Stdout), level, ) return &Logger{zap.New(core).Sugar()} } // With adds structured context to the logger. func (l *Logger) With(args ...interface{}) *Logger { return &Logger{l.SugaredLogger.With(args...)} }