// Package logging builds the application's slog logger. Logs go to stderr // (readable console in dev, structured JSON otherwise) and, optionally, to a // file. There is no database sink — see AGENT.md §7. package logging import ( "io" "log/slog" "os" ) // Setup returns a configured *slog.Logger and, if a file sink was opened, an // io.Closer to flush/close it on shutdown (nil when no file sink is used). func Setup(dev bool, logFile string) (*slog.Logger, io.Closer, error) { var w io.Writer = os.Stderr var closer io.Closer if logFile != "" { f, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o644) if err != nil { return nil, nil, err } w = io.MultiWriter(os.Stderr, f) closer = f } var handler slog.Handler if dev { handler = slog.NewTextHandler(w, &slog.HandlerOptions{Level: slog.LevelDebug}) } else { handler = slog.NewJSONHandler(w, &slog.HandlerOptions{Level: slog.LevelInfo}) } return slog.New(handler), closer, nil }