diff options
| author | Xe Iaso <me@xeiaso.net> | 2023-07-27 09:26:08 -0400 |
|---|---|---|
| committer | Xe Iaso <me@xeiaso.net> | 2023-07-27 09:26:08 -0400 |
| commit | 8a7ab2c06f39492974808998616792bcc120315e (patch) | |
| tree | 72ef683b33792768a562014fbad0dfaa2b1e241e /internal | |
| parent | a862de3cace9da8bf3fec8dc9348dec08a60bbb6 (diff) | |
| download | x-8a7ab2c06f39492974808998616792bcc120315e.tar.xz x-8a7ab2c06f39492974808998616792bcc120315e.zip | |
internal/slog: add debug route for changing the slog level on the fly
Signed-off-by: Xe Iaso <me@xeiaso.net>
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) + }) } |
