diff options
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/slog/slog.go | 31 |
1 files changed, 30 insertions, 1 deletions
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) + }) } |
