package logger import ( "fmt" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) // loggerConfig 内部配置结构体 type loggerConfig struct { level zapcore.Level development bool encoding string outputPaths []string } // LoggerOption 配置选项函数类型 type LoggerOption func(*loggerConfig) // WithLevel 设置日志级别 func WithLevel(level zapcore.Level) LoggerOption { return func(c *loggerConfig) { c.level = level } } // WithOutputPaths 设置输出路径 func WithOutputPaths(paths ...string) LoggerOption { return func(c *loggerConfig) { c.outputPaths = paths } } // WithDevelopment 设置开发模式 func WithDevelopment(dev bool) LoggerOption { return func(c *loggerConfig) { c.development = dev } } // WithEncoding 设置编码格式 func WithEncoding(encoding string) LoggerOption { return func(c *loggerConfig) { c.encoding = encoding } } // zapLogger Zap日志器实现 type zapLogger struct { *zap.Logger } // NewLogger 创建新的日志器 func NewLogger(opts ...LoggerOption) (Logger, error) { config := &loggerConfig{ level: zapcore.InfoLevel, development: false, encoding: "json", outputPaths: []string{"stdout"}, } for _, opt := range opts { opt(config) } zapConfig := zap.Config{ Level: zap.NewAtomicLevelAt(config.level), Development: config.development, Encoding: config.encoding, EncoderConfig: zapcore.EncoderConfig{ TimeKey: "timestamp", LevelKey: "level", NameKey: "logger", CallerKey: "caller", FunctionKey: zapcore.OmitKey, MessageKey: "message", StacktraceKey: "stacktrace", LineEnding: zapcore.DefaultLineEnding, EncodeLevel: zapcore.LowercaseLevelEncoder, EncodeTime: zapcore.ISO8601TimeEncoder, EncodeDuration: zapcore.SecondsDurationEncoder, EncodeCaller: zapcore.ShortCallerEncoder, }, OutputPaths: config.outputPaths, ErrorOutputPaths: []string{"stderr"}, } logger, err := zapConfig.Build() if err != nil { return nil, fmt.Errorf("failed to build zap logger: %w", err) } return &zapLogger{Logger: logger}, nil } // Debug 记录调试日志 func (l *zapLogger) Debug(msg string, fields ...zap.Field) { l.Logger.Debug(msg, fields...) } // Info 记录信息日志 func (l *zapLogger) Info(msg string, fields ...zap.Field) { l.Logger.Info(msg, fields...) } // Warn 记录警告日志 func (l *zapLogger) Warn(msg string, fields ...zap.Field) { l.Logger.Warn(msg, fields...) } // Error 记录错误日志 func (l *zapLogger) Error(msg string, fields ...zap.Field) { l.Logger.Error(msg, fields...) } // Fatal 记录致命日志 func (l *zapLogger) Fatal(msg string, fields ...zap.Field) { l.Logger.Fatal(msg, fields...) } // With 创建带有额外字段的日志器 func (l *zapLogger) With(fields ...zap.Field) Logger { return &zapLogger{Logger: l.Logger.With(fields...)} } // Named 创建带有名称的日志器 func (l *zapLogger) Named(name string) Logger { return &zapLogger{Logger: l.Logger.Named(name)} } // Sync 同步日志输出 func (l *zapLogger) Sync() error { return l.Logger.Sync() }