log and log/slogimport "log"
log.Println("info")
log.Fatal(err) // exits
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.SetPrefix("api: ")
slog, Go 1.21+)import "log/slog"
slog.Info("request", "method", "GET", "path", "/health", "ms", 3)
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Error("failed", "err", err)
Debug, Info, Warn, Error — map to handlers and slog.Level thresholds.
Use slog.With or pass context.Context with handlers that read trace IDs from context.
Precompute static attribute slices; avoid expensive String() in hot Debug paths — or gate with level checks.
zap and zerolog remain popular for maximum throughput; slog is enough for many services.