aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
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)
+ })
}