package logging import ( "os" "strings" "time" "hfb_sys/backend/internal/config" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) func New(cfg config.LogConfig) (*zap.Logger, error) { location, err := time.LoadLocation("Asia/Shanghai") if err != nil { location = time.FixedZone("Asia/Shanghai", 8*60*60) } level := zap.NewAtomicLevelAt(parseLevel(cfg.Level)) encoderConfig := zap.NewProductionEncoderConfig() encoderConfig.TimeKey = "time" encoderConfig.LevelKey = "level" encoderConfig.MessageKey = "message" encoderConfig.CallerKey = "caller" encoderConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) { enc.AppendString(t.In(location).Format("2006-01-02 15:04:05.000 -0700")) } encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder encoderConfig.EncodeDuration = zapcore.StringDurationEncoder encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder cores := make([]zapcore.Core, 0, 2) if cfg.EnableConsole { cores = append(cores, zapcore.NewCore( zapcore.NewConsoleEncoder(encoderConfig), zapcore.Lock(os.Stdout), level, )) } if cfg.EnableFile { writer := newDailyWriter(cfg.Dir, "app", location, cfg.RetainDays) cores = append(cores, zapcore.NewCore( zapcore.NewJSONEncoder(encoderConfig), writer, level, )) } if len(cores) == 0 { cores = append(cores, zapcore.NewCore( zapcore.NewConsoleEncoder(encoderConfig), zapcore.Lock(os.Stdout), level, )) } return zap.New( zapcore.NewTee(cores...), zap.AddCaller(), zap.AddStacktrace(zapcore.PanicLevel), ), nil } func parseLevel(value string) zapcore.Level { switch strings.ToLower(strings.TrimSpace(value)) { case "debug": return zapcore.DebugLevel case "warn", "warning": return zapcore.WarnLevel case "error": return zapcore.ErrorLevel default: return zapcore.InfoLevel } }