package logger import ( "io" "log/slog" "os" ) // CreateLogger creates a logger writing to both stderr and the given file. // If the file cannot be opened, returns a logger that writes only to stderr and a no-op cleanup. // Log level is controlled by the LOG_LEVEL env var (debug/info/warn/error); defaults to info. func CreateLogger(fname string) (*slog.Logger, func()) { lvl := &slog.LevelVar{} if v := os.Getenv("LOG_LEVEL"); v != "" { _ = lvl.UnmarshalText([]byte(v)) } opts := &slog.HandlerOptions{Level: lvl} f, err := os.OpenFile(fname, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err != nil { return slog.New(slog.NewJSONHandler(os.Stderr, opts)), func() {} } w := io.MultiWriter(os.Stderr, f) logger := slog.New(slog.NewJSONHandler(w, opts)) cleanup := func() { f.Close() } return logger, cleanup }