From 8a7ab2c06f39492974808998616792bcc120315e Mon Sep 17 00:00:00 2001 From: Xe Iaso Date: Thu, 27 Jul 2023 09:26:08 -0400 Subject: internal/slog: add debug route for changing the slog level on the fly Signed-off-by: Xe Iaso --- internal/slog/slog.go | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/internal/slog/slog.go b/internal/slog/slog.go index 839417c..cdb83b9 100644 --- a/internal/slog/slog.go +++ b/internal/slog/slog.go @@ -4,6 +4,8 @@ package slog import ( "flag" "fmt" + "io" + "net/http" "os" "golang.org/x/exp/slog" @@ -14,6 +16,8 @@ var ( // The current slog handler. Handler slog.Handler + + leveler *slog.LevelVar ) func Init() { @@ -23,11 +27,36 @@ func Init() { programLevel = slog.LevelInfo } + leveler = &slog.LevelVar{} + leveler.Set(programLevel) + h := slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{ AddSource: true, - Level: programLevel, + Level: leveler, }) slog.SetDefault(slog.New(h)) Handler = h + + http.HandleFunc("/.within/debug/slog-level", func(w http.ResponseWriter, r *http.Request) { + var level, old slog.Level + defer r.Body.Close() + + old = leveler.Level() + + data, err := io.ReadAll(http.MaxBytesReader(w, r.Body, 64)) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + if err := (&level).UnmarshalText(data); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + leveler.Set(level) + slog.Info("changed level", "from", old, "to", level) + fmt.Fprintln(w, level) + }) } -- cgit v1.2.3