package config import ( "fmt" "os" "path/filepath" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) // InitLogger 初始化日志 func InitLogger(cfg *LogConfig) (*zap.Logger, error) { encoderConfig := zapcore.EncoderConfig{ TimeKey: "time", LevelKey: "level", NameKey: "logger", CallerKey: "caller", MessageKey: "msg", StacktraceKey: "stacktrace", LineEnding: zapcore.DefaultLineEnding, EncodeLevel: zapcore.LowercaseLevelEncoder, EncodeTime: zapcore.ISO8601TimeEncoder, EncodeDuration: zapcore.SecondsDurationEncoder, EncodeCaller: zapcore.ShortCallerEncoder, } var writer zapcore.WriteSyncer switch cfg.Output { case "stdout": writer = zapcore.AddSync(os.Stdout) case "stderr": writer = zapcore.AddSync(os.Stderr) default: // 创建日志目录 if err := os.MkdirAll(filepath.Dir(cfg.Output), 0755); err != nil { return nil, fmt.Errorf("failed to create log directory: %w", err) } file, err := os.OpenFile(cfg.Output, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { return nil, fmt.Errorf("failed to open log file: %w", err) } writer = zapcore.AddSync(file) } // 解析日志级别 var level zapcore.Level switch cfg.Level { case "debug": level = zapcore.DebugLevel case "info": level = zapcore.InfoLevel case "warn": level = zapcore.WarnLevel case "error": level = zapcore.ErrorLevel default: level = zapcore.InfoLevel } core := zapcore.NewCore( zapcore.NewJSONEncoder(encoderConfig), writer, level, ) logger := zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel)) return logger, nil }