log.Default().Panic(err)
}
- go (func() {
+ go func() {
for {
upd, err := watcher.Next()
if err != nil {
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)
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
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.
//
// management.
type Logger interface {
coreLogger
+ slog.Handler
AppendPrefix(string) Logger
WithPrefix(string) Logger
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 {
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)
+}