// Package logger 提供最小化的結構化 JSON logger,建構於 Go 1.21+ 的 log/slog。 // // 設計原則: // - 所有日誌為 JSON line,便於雲端 log aggregator 解析(CloudWatch / Loki / Datadog)。 // - 不包太多層 — 直接回傳 *slog.Logger,由呼叫端自由使用 slog 的 API。 // - 輸出到 stdout(12-Factor App 第 11 條:logs as event streams)。 package logger import ( "log/slog" "os" "strings" ) // New 建立一個輸出為 JSON 的結構化 logger。 // // level 接受 "debug" / "info" / "warn" / "error"(大小寫不敏感); // 無法解析時預設為 info。 func New(level string) *slog.Logger { handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ Level: parseLevel(level), AddSource: false, // 需要時再開;預設關閉以降低額外成本 }) return slog.New(handler) } // parseLevel 將字串解析為 slog.Level,無法解析時回傳 LevelInfo。 func parseLevel(s string) slog.Level { switch strings.ToLower(strings.TrimSpace(s)) { case "debug": return slog.LevelDebug case "warn", "warning": return slog.LevelWarn case "error", "err": return slog.LevelError default: return slog.LevelInfo } }