From: Dan Fuhry Date: Mon, 19 Oct 2026 20:45:26 +0000 (-0400) Subject: [utils/log] implement slog.Handler interface X-Git-Url: https://go.fuhry.dev/?a=commitdiff_plain;h=36aaaf2e96c1cf5f4f22ffb0e84f158c815d3405;p=runtime.git [utils/log] implement slog.Handler interface --- diff --git a/cmd/http_proxy/main.go b/cmd/http_proxy/main.go index fa7c042..6452d0a 100644 --- a/cmd/http_proxy/main.go +++ b/cmd/http_proxy/main.go @@ -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) diff --git a/utils/log/http.go b/utils/log/http.go index 7ae8e7f..421b44a 100644 --- a/utils/log/http.go +++ b/utils/log/http.go @@ -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 diff --git a/utils/log/log.go b/utils/log/log.go index cdab817..079e707 100644 --- a/utils/log/log.go +++ b/utils/log/log.go @@ -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) +}