]> go.fuhry.dev Git - runtime.git/commitdiff
[utils/log] implement slog.Handler interface
authorDan Fuhry <dan@fuhry.com>
Mon, 19 Oct 2026 20:45:26 +0000 (16:45 -0400)
committerDan Fuhry <dan@fuhry.com>
Mon, 19 Oct 2026 21:28:53 +0000 (17:28 -0400)
cmd/http_proxy/main.go
utils/log/http.go
utils/log/log.go

index fa7c0428af395085dc8700637b8baf762349e178..6452d0ac891091c230953a2e6d453214cec70d01 100644 (file)
@@ -41,7 +41,7 @@ func main() {
                log.Default().Panic(err)
        }
 
-       go (func() {
+       go func() {
                for {
                        upd, err := watcher.Next()
                        if err != nil {
@@ -52,23 +52,23 @@ func main() {
 
                        err = yaml.Unmarshal(upd.Contents, server)
                        if err != nil {
-                               log.Default().Alertf("YAML unmarshal/hot reload failed, ignoring update: ", err)
+                               log.Default().Alertf("YAML unmarshal/hot reload failed, ignoring update: %v", err)
                                continue
                        }
                }
-       })()
+       }()
 
-       go (func() {
+       go func() {
                if err := server.ListenAndServeTLS(); err != nil && err != http.ErrServerClosed {
                        log.Panic(err)
                }
-       })()
+       }()
 
-       go (func() {
+       go func() {
                if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
                        log.Panic(err)
                }
-       })()
+       }()
 
        daemon.SdNotify(false, daemon.SdNotifyReady)
 
index 7ae8e7f4266a713f6ec15d3b5fce061cdd42e60c..421b44a6db8979621fa60ff1ec6204a56d27741a 100644 (file)
@@ -30,9 +30,11 @@ type statusRecorder struct {
        BytesWritten uint
 }
 
-type ExtraFunc func(map[string]any, http.ResponseWriter, *http.Request)
-type mutableContext map[any]any
-type ctxVar int
+type (
+       ExtraFunc      func(map[string]any, http.ResponseWriter, *http.Request)
+       mutableContext map[any]any
+       ctxVar         int
+)
 
 const (
        kLoggerCtx ctxVar = iota
index cdab8176e6f89d3b2b0563583307733995ee296a..079e707a3a550bca9ad8b2748c2d3aaa54bb87b8 100644 (file)
@@ -1,16 +1,15 @@
 package log
 
 import (
+       "context"
        "flag"
        "io"
        "log"
+       "log/slog"
        "os"
        "sync"
 )
 
-var logVerbosity int = 0
-var logLevel string = "notice"
-
 // interface coreLogger contains only the core functionality needed for logging, without
 // level or verbosity methods.
 //
@@ -32,6 +31,7 @@ type coreLogger interface {
 // management.
 type Logger interface {
        coreLogger
+       slog.Handler
 
        AppendPrefix(string) Logger
        WithPrefix(string) Logger
@@ -63,12 +63,28 @@ type internalLogger struct {
        prefix string
 }
 
+type ctxKey uint
+
 type logger struct {
        *internalLogger
+
+       slogAttrs []slog.Attr
 }
 
-var defaultLogger Logger
-var defaultLoggerOnce sync.Once
+const (
+       kVerbosity ctxKey = iota
+)
+
+var _ coreLogger = &internalLogger{}
+
+var _ Logger = &logger{}
+
+var (
+       logVerbosity      int    = 0
+       logLevel          string = "notice"
+       defaultLogger     Logger
+       defaultLoggerOnce sync.Once
+)
 
 func init() {
        if vv := flag.Lookup("vv"); vv == nil {
@@ -322,3 +338,42 @@ func (l *logger) Alert(v ...any) {
 func (l *logger) Alertf(fmtstr string, v ...any) {
        l.WithLevel(ALERT).Printf(fmtstr, v...)
 }
+
+func (l *logger) Enabled(ctx context.Context, level slog.Level) bool {
+       val := ctx.Value(kVerbosity)
+       if v, ok := val.(int); ok {
+               if logVerbosity < v {
+                       return false
+               }
+       }
+
+       switch level {
+       case slog.LevelDebug:
+               return l.level <= DEBUG
+       case slog.LevelInfo:
+               return l.level <= INFO
+       case slog.LevelWarn:
+               return l.level <= WARNING
+       case slog.LevelError:
+               return l.level <= ERROR
+       }
+
+       return true
+}
+
+func (l *logger) Handle(ctx context.Context, record slog.Record) error {
+       return nil
+}
+
+func (l *logger) WithAttrs(attrs []slog.Attr) slog.Handler {
+       nl := &logger{internalLogger: l.internalLogger}
+       nl.slogAttrs = make([]slog.Attr, len(l.slogAttrs))
+       copy(nl.slogAttrs, l.slogAttrs)
+       nl.slogAttrs = append(nl.slogAttrs, attrs...)
+
+       return nl
+}
+
+func (l *logger) WithGroup(name string) slog.Handler {
+       return l.AppendPrefix(name).(*logger)
+}