package logger import ( "io" "log/slog" "os" "strings" "server/internal/config" "gopkg.in/natefinch/lumberjack.v2" ) // New 根据配置创建 slog.Logger,并将其设置为默认 logger。 // 日志会写入文件(自动按大小/时间滚动),并可选同时输出到控制台。 func New(cfg *config.Config) *slog.Logger { logCfg := cfg.Log // 文件滚动写入 fileWriter := &lumberjack.Logger{ Filename: defaultStr(logCfg.Filename, "logs/app.log"), MaxSize: defaultInt(logCfg.MaxSize, 100), // MB MaxBackups: defaultInt(logCfg.MaxBackups, 30), MaxAge: defaultInt(logCfg.MaxAge, 30), // days Compress: logCfg.Compress, } var writer io.Writer = fileWriter if logCfg.Console { writer = io.MultiWriter(os.Stdout, fileWriter) } opts := &slog.HandlerOptions{ Level: parseLevel(logCfg.Level), AddSource: false, } // 生产环境用 JSON,便于日志采集/检索;开发环境用文本更易读 var handler slog.Handler if config.IsDev() { handler = slog.NewTextHandler(writer, opts) } else { handler = slog.NewJSONHandler(writer, opts) } l := slog.New(handler) slog.SetDefault(l) // 让全局 slog.Info/Error 也走同一套配置 return l } func parseLevel(level string) slog.Level { switch strings.ToLower(level) { case "debug": return slog.LevelDebug case "warn", "warning": return slog.LevelWarn case "error": return slog.LevelError default: return slog.LevelInfo } } func defaultStr(v, def string) string { if v == "" { return def } return v } func defaultInt(v, def int) int { if v <= 0 { return def } return v }