aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2023-07-27 09:26:08 -0400
committerXe Iaso <me@xeiaso.net>2023-07-27 09:26:08 -0400
commit8a7ab2c06f39492974808998616792bcc120315e (patch)
tree72ef683b33792768a562014fbad0dfaa2b1e241e /internal
parenta862de3cace9da8bf3fec8dc9348dec08a60bbb6 (diff)
downloadx-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.go31
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)
+ })
}