]> go.fuhry.dev Git - runtime.git/commitdiff
log: make Logger an interface
authorDan Fuhry <dan@fuhry.com>
Mon, 30 Dec 2024 19:14:00 +0000 (14:14 -0500)
committerDan Fuhry <dan@fuhry.com>
Mon, 30 Dec 2024 19:14:00 +0000 (14:14 -0500)
Logger needs to be mockable, and for that we need it to be an interface.

21 files changed:
attestation/internal/attestation/server.go
grpc/server.go
machines/client.go
machines/coredns_plugin/registry.go
machines/coredns_plugin/registry_store.go
machines/coredns_plugin/setup.go
machines/event_watcher.go
machines/oauth2.go
metrics/metricbus/internal/server.go
metrics/metricbus/mbclient/client.go
metrics/mtls/stats.go
mtls/fsnotify/fsnotify.go
mtls/identity.go
mtls/provider_keychain_macos.go
mtls/verify_names.go
sd/monitor.go
sd/publish.go
sd/watcher.go
thirdparty/registry/main.go
utils/daemon/daemonize.go
utils/log/log.go

index d6fccdf0565a99753fc2292248101a34da4dc1d5..f9a945e9e8b07767ad12ccbd561a1113465adbe1 100644 (file)
@@ -20,7 +20,7 @@ import (
        "go.fuhry.dev/runtime/utils/log"
 )
 
-var logger *log.Logger
+var logger log.Logger
 
 func init() {
        logger = log.WithPrefix("AttestationServer")
index 94b74becbc81e131cb2d8b8c5b42ddb6714b8c1b..b0954311aca708c34cb243fa06f32e45bc3c9bc2 100644 (file)
@@ -30,7 +30,7 @@ type Server struct {
        port       uint16
        verifier   mtls.MTLSPeerVerifier
        acl        acl.ACLChecker
-       log        *log.Logger
+       log        log.Logger
        sessions   *lru.Cache[string, *session]
        connFac    ConnectionFactory
 }
index 0959092e20ed7be9612d6f41f5011b9ba6bd53c4..dc9a1f06335a7ea3c405455b466e7f50f2573463 100644 (file)
@@ -57,7 +57,7 @@ type machinesClient struct {
        client    *http.Client
        baseUrl   string
        eventsUrl string
-       logger    *log.Logger
+       logger    log.Logger
        stats     *clientStats
 }
 
index 26a0dfcc8298d61362bbe96f6da41a7fa187d431..e1f28c4d9797b793a48a8c1c531029819543c131 100644 (file)
@@ -37,7 +37,7 @@ type Result struct {
 }
 
 type registry struct {
-       log          *log.Logger
+       log          log.Logger
        ctx          context.Context
        cancel       context.CancelFunc
        client       machines.MachinesClient
index 9ba83e8d499e91ba2955c7bd2c290fdb001d4539..a49d133da0f6f20c8f4870433c594c07d67c5df3 100644 (file)
@@ -15,7 +15,7 @@ import (
 
 type registryStore struct {
        mu  sync.Mutex `json:"-"`
-       log *log.Logger
+       log log.Logger
 
        Sites              map[string]*machines.Site                      `json:"Sites"`
        Domains            map[string]*machines.Domain                    `json:"Domains"`
index 54b77750ad05654d0d40695abc6a4f4cb13d72cb..d65d5e7606d64c1a0eb8c4928c2a4eafcd620826 100644 (file)
@@ -20,7 +20,7 @@ func setup(c *caddy.Controller) error {
        reg := NewRegistry(context.Background())
 
        m := &Machines{
-               log: *log.WithPrefix(fmt.Sprintf("plugin/%s_machines", constants.OrgSlug)),
+               log: log.WithPrefix(fmt.Sprintf("plugin/%s_machines", constants.OrgSlug)),
                r:   reg,
        }
 
index 4efa6320b61ce2eb566fa73a695157f66dae1b2f..24d9006e3fbd9b3f750b79b37759156629ba9a2c 100644 (file)
@@ -24,7 +24,7 @@ type MachinesMqttEvent struct {
 func (mc *machinesClient) NewEventListener(ctx context.Context) (chan MachinesMqttEvent, error) {
        mqttLogger := mc.logger.AppendPrefix(".mqtt")
 
-       mqtt.DEBUG = mqttLogger.WithLevel(log.DEBUG).V(3)
+       mqtt.DEBUG = mqttLogger.V(3).WithLevel(log.DEBUG)
        mqtt.WARN = mqttLogger.WithLevel(log.WARNING)
        mqtt.ERROR = mqttLogger.WithLevel(log.ERROR)
        mqtt.CRITICAL = mqttLogger.WithLevel(log.CRITICAL)
index 4a5c61f63a7599e783cc625afe234a535a7c5f2f..03eca7cf598590ffab3a2bab813e6f0439d2ef42 100644 (file)
@@ -50,7 +50,7 @@ type oauthClient struct {
        inner  http.RoundTripper
        store  *oauthClientCredentials_Store
        params *oauthAuthParams
-       log    *log.Logger
+       log    log.Logger
 }
 
 func SetupOAuthClient(client *http.Client, tokenEndpoint string, clientId string, clientSecret string, scope []string) error {
index ba3f78c236c281caef4024f3a9229f5cfbbbb087..1109899d50aba6c7bcc6212674d1e25c25ce87e8 100644 (file)
@@ -64,7 +64,7 @@ type mbService struct {
 }
 
 type mbServicer struct {
-       log         *log.Logger
+       log         log.Logger
        serviceLock sync.RWMutex
        services    map[uint64]*mbService
        serviceSet  *hashset.HashSet[string]
@@ -75,7 +75,7 @@ type mbServicer struct {
 }
 
 type mbServer struct {
-       log         *log.Logger
+       log         log.Logger
        ctx         context.Context
        servicer    *mbServicer
        httpServer  *http.Server
@@ -209,7 +209,7 @@ func (s *mbServer) Start(ctx context.Context) error {
        return nil
 }
 
-func newMetricBusServicer(log *log.Logger) (*mbServicer, error) {
+func newMetricBusServicer(log log.Logger) (*mbServicer, error) {
        s := &mbServicer{
                log:        log.AppendPrefix(".servicer"),
                services:   make(map[uint64]*mbService, 0),
index fd62fef71890c05c34e879c21ca46d14cba2f1b1..a74435fcff82caf30f59485c032b63d16a0015af 100644 (file)
@@ -21,7 +21,7 @@ type MetricBusService struct {
        name     string
        instance string
 
-       log *log.Logger
+       log log.Logger
 
        client         metricBusLowLevelConnection
        ctx            context.Context
index af87e3f1aa535b24ce6ffefd5468fbc44c37f547..8315d96421c608eac1dccfcf853332a7cbfc15c7 100644 (file)
@@ -17,7 +17,7 @@ import (
 )
 
 type mtlsMetrics struct {
-       log *log.Logger
+       log log.Logger
 
        svc *mbclient.MetricBusService
 
index 367906c197bc5286bf5f31c28f599801fd746bb2..9fd4d14150522b956a34bdcd47a122d7d2aefa04 100644 (file)
@@ -23,7 +23,7 @@ var (
 
 var startWatcherMu sync.Mutex
 var gWatcher *fsnotify.Watcher
-var logger *log.Logger
+var logger log.Logger
 var pendingWrites *hashset.HashSet[string]
 var watched *hashset.HashSet[string]
 var watchHandlers map[string][]NotifyFunc
index 451cd60a83e1ab78f3452b3ccffc8d66f2123ba9..ed70ad0d0b61aee9afb430d979092aa58b86bc3e 100644 (file)
@@ -40,7 +40,7 @@ const (
 
 var (
        defaultMtlsIdentity string
-       logger              *log.Logger
+       logger              log.Logger
 )
 
 type Identity interface {
index 104f6423fde6f49450842ff57fc4d60f6479761c..bf10632267e45ee8618a23a65194f6cca9c6ce22 100644 (file)
@@ -64,7 +64,7 @@ func (kso *kcSignerOpts) HashFunc() crypto.Hash {
        return kso.hash
 }
 
-var kcLogger *log.Logger
+var kcLogger log.Logger
 
 func init() {
        kcLogger = log.WithPrefix("mtls.macOSKeychain")
index d1d180b9c94dd9165b784771d7b7e55e47140558..672c62c72e727b6eed05a7f0e575f3dd7e27b122 100644 (file)
@@ -90,7 +90,7 @@ type mtlsPeerVerifier struct {
        MTLSPeerVerifier
 
        allowedPrincipals map[IdentityClass]*hashset.HashSet[string]
-       log               *log.Logger
+       log               log.Logger
 }
 
 func NewPeerNameVerifier() MTLSPeerVerifier {
index a50fca868fcef445b00deafc9163b0bb5ff27aa4..579d6ab31fac0bb9f0f3edcdcf02991f848c8a91 100644 (file)
@@ -18,7 +18,7 @@ type healthCheckingPublisher struct {
        publisher   *SDPublisher
        healthcheck HealthCheckService
        etcdClient  *etcd_client.Client
-       logger      *log.Logger
+       logger      log.Logger
 }
 
 type SDHealthReport struct {
index 2c56fc89e94ff84b58e85ad554cb58812a97a94a..02f01d1171890a2d0f1d19b62e6b8fe302eb9d5b 100644 (file)
@@ -38,7 +38,7 @@ type SDPublisher struct {
        mtx *sync.Mutex
        wg  *sync.WaitGroup
 
-       logger *log.Logger
+       logger log.Logger
        leases etcd_client.Lease
        lease  *etcd_client.LeaseGrantResponse
        ctx    context.Context
index 1e334c7a78eab2b8e56161381a3efac1052eed8f..8eca2e9e063faaee7abe6ea4ba1c27d71d47b385 100644 (file)
@@ -23,7 +23,7 @@ type SDWatcher struct {
        Service    string
        EtcdClient *etcd_client.Client
 
-       logger       *log.Logger
+       logger       log.Logger
        starter      *sync.Once
        lock         *sync.RWMutex
        wg           *sync.WaitGroup
index 592e6a622a3c9f44b12fdd2e18548b4bdb2e9bd8..63730b9bd8b71c0e7b1fb3bfb25c46ad462ce1f4 100644 (file)
@@ -31,7 +31,7 @@ import (
        "go.fuhry.dev/runtime/utils/log"
 )
 
-var logger *log.Logger
+var logger log.Logger
 var DefaultSSLCertificate = "registry." + constants.WebServicesDomain
 
 const (
index 35fcde0765979328a42e26e119d5416cfe709527..fab9e5812a61dd714cde26b1fc4da2b3d0edefdd 100644 (file)
@@ -18,7 +18,7 @@ import (
 const logDirDefaultMode os.FileMode = 0700
 const logFileDefaultMode os.FileMode = 0600
 
-var logger *log.Logger
+var logger log.Logger
 
 var stdoutReopenPath, stderrReopenPath string
 var detach bool
index e125f2928503de9f6ea3002e905f6f627285bf46..aac0de294ffbe7e5087aa0022a013b0aeb5b5477 100644 (file)
@@ -11,14 +11,62 @@ import (
 var logVerbosity int = 0
 var logLevel string = "notice"
 
-type Logger struct {
+// interface coreLogger contains only the core functionality needed for logging, without
+// level or verbosity methods.
+//
+// This interface can be implemented by mocks for testing.
+type coreLogger interface {
+       WithLevel(Level) coreLogger
+
+       Print(...any)
+       Printf(string, ...any)
+       Println(...any)
+       Fatal(...any)
+       Fatalf(string, ...any)
+       Panic(...any)
+       Panicf(string, ...any)
+       Panicln(...any)
+}
+
+// interface Logger describes a logger with verbosity and level filtering, and prefix
+// management.
+type Logger interface {
+       coreLogger
+
+       AppendPrefix(string) Logger
+       WithPrefix(string) Logger
+       V(int) Logger
+
+       Debug(...any)
+       Debugf(string, ...any)
+       Info(...any)
+       Infof(string, ...any)
+       Notice(...any)
+       Noticef(string, ...any)
+       Warning(...any)
+       Warningf(string, ...any)
+       Warn(...any)
+       Warnf(string, ...any)
+       Error(...any)
+       Errorf(string, ...any)
+       Critical(...any)
+       Criticalf(string, ...any)
+       Alert(...any)
+       Alertf(string, ...any)
+}
+
+type internalLogger struct {
        *log.Logger
 
        level  Level
        prefix string
 }
 
-var defaultLogger *Logger
+type logger struct {
+       *internalLogger
+}
+
+var defaultLogger Logger
 var defaultLoggerOnce sync.Once
 
 func init() {
@@ -26,7 +74,7 @@ func init() {
        flag.StringVar(&logLevel, "v", INFO.String(), "syslog log level for logs")
 }
 
-func V(level int) *Logger {
+func V(level int) Logger {
        if logVerbosity >= level {
                return Default()
        }
@@ -34,21 +82,27 @@ func V(level int) *Logger {
        return NullLogger()
 }
 
-func Default() *Logger {
+func Default() Logger {
        defaultLoggerOnce.Do(func() {
-               defaultLogger = &Logger{
-                       Logger: log.New(os.Stderr, "", log.LstdFlags),
+               defaultLogger = &logger{
+                       internalLogger: &internalLogger{
+                               Logger: log.New(os.Stderr, "", log.LstdFlags),
+                       },
                }
        })
        return defaultLogger
 }
 
-func WithPrefix(prefix string) *Logger {
+func WithPrefix(prefix string) Logger {
        return Default().WithPrefix(prefix)
 }
 
-func NullLogger() *Logger {
-       return &Logger{Logger: log.New(io.Discard, "", 0)}
+func NullLogger() Logger {
+       return &logger{
+               internalLogger: &internalLogger{
+                       Logger: log.New(io.Discard, "", 0),
+               },
+       }
 }
 
 func Print(v ...any) {
@@ -83,42 +137,36 @@ func Panicln(v ...any) {
        Default().Panicln(v...)
 }
 
-func (l *Logger) V(level int) *Logger {
-       if logVerbosity >= level {
-               return l
-       }
-       return NullLogger()
-}
-
-func (l *Logger) WithPrefix(prefix string) *Logger {
-       return &Logger{
-               Logger: l.Logger,
-               prefix: prefix,
-               level:  l.level,
-       }
-}
-
-func (l Logger) WithLevel(lv Level) *Logger {
+func (l *internalLogger) WithLevel(lv Level) coreLogger {
        if lv < LevelFromString(logLevel) {
                return NullLogger()
        }
 
-       return &Logger{
+       return &internalLogger{
                Logger: l.Logger,
                prefix: l.prefix,
                level:  lv,
        }
 }
 
-func (l *Logger) AppendPrefix(prefix string) *Logger {
-       return &Logger{
-               Logger: l.Logger,
-               prefix: l.prefix + prefix,
-               level:  l.level,
+func (l *internalLogger) Print(v ...any) {
+       args := l.prependPrefixes(v)
+       l.Logger.Print(args...)
+}
+
+func (l *internalLogger) Printf(fmtstr string, v ...any) {
+       if l.prefix != "" {
+               fmtstr = "[" + l.prefix + "] " + fmtstr
        }
+
+       l.Logger.Printf(l.level.prefix(l.Writer())+fmtstr, v...)
 }
 
-func (l *Logger) prependPrefixes(v []any) []any {
+func (l *internalLogger) Println(v ...any) {
+       l.Print(v...)
+}
+
+func (l *internalLogger) prependPrefixes(v []any) []any {
        prefix := ""
        if l.prefix != "" {
                prefix = "[" + l.prefix + "] "
@@ -131,103 +179,113 @@ func (l *Logger) prependPrefixes(v []any) []any {
        return args
 }
 
-func (l *Logger) Print(v ...any) {
-       args := l.prependPrefixes(v)
-       l.Logger.Print(args...)
+func (l *internalLogger) Fatal(v ...any) {
+       if len(v) > 0 {
+               if arg1, ok := v[0].(string); ok {
+                       if l.prefix != "" {
+                               v[0] = FATAL.prefix(l.Writer()) + "[" + l.prefix + "] " + arg1
+                       }
+               }
+       }
+
+       l.Logger.Fatal(v...)
 }
 
-func (l *Logger) Printf(fmtstr string, v ...any) {
+func (l *internalLogger) Fatalf(fmtstr string, v ...any) {
        if l.prefix != "" {
-               fmtstr = "[" + l.prefix + "] " + fmtstr
+               fmtstr = FATAL.prefix(l.Writer()) + "[" + l.prefix + "] " + fmtstr
        }
 
-       l.Logger.Printf(l.level.prefix(l.Writer())+fmtstr, v...)
+       l.Logger.Fatalf(fmtstr, v...)
 }
 
-func (l *Logger) Println(v ...any) {
-       l.Print(v...)
+func (l *logger) V(level int) Logger {
+       if logVerbosity >= level {
+               return l
+       }
+       return NullLogger()
+}
+
+func (l *logger) WithPrefix(prefix string) Logger {
+       return &logger{
+               internalLogger: &internalLogger{
+                       Logger: l.Logger,
+                       prefix: l.internalLogger.prefix,
+                       level:  l.level,
+               },
+       }
 }
 
-func (l *Logger) Debug(v ...any) {
+func (l *logger) AppendPrefix(prefix string) Logger {
+       return &logger{
+               internalLogger: &internalLogger{
+                       Logger: l.Logger,
+                       prefix: l.internalLogger.prefix + prefix,
+                       level:  l.level,
+               },
+       }
+}
+
+func (l *logger) Debug(v ...any) {
        l.WithLevel(DEBUG).Print(v...)
 }
 
-func (l *Logger) Debugf(fmtstr string, v ...any) {
+func (l *logger) Debugf(fmtstr string, v ...any) {
        l.WithLevel(DEBUG).Printf(fmtstr, v...)
 }
 
-func (l *Logger) Info(v ...any) {
+func (l *logger) Info(v ...any) {
        l.WithLevel(INFO).Print(v...)
 }
 
-func (l *Logger) Infof(fmtstr string, v ...any) {
+func (l *logger) Infof(fmtstr string, v ...any) {
        l.WithLevel(INFO).Printf(fmtstr, v...)
 }
 
-func (l *Logger) Notice(v ...any) {
+func (l *logger) Notice(v ...any) {
        l.WithLevel(NOTICE).Print(v...)
 }
 
-func (l *Logger) Noticef(fmtstr string, v ...any) {
+func (l *logger) Noticef(fmtstr string, v ...any) {
        l.WithLevel(NOTICE).Printf(fmtstr, v...)
 }
 
-func (l *Logger) Warning(v ...any) {
+func (l *logger) Warning(v ...any) {
        l.WithLevel(WARNING).Print(v...)
 }
 
-func (l *Logger) Warningf(fmtstr string, v ...any) {
+func (l *logger) Warningf(fmtstr string, v ...any) {
        l.WithLevel(WARNING).Printf(fmtstr, v...)
 }
 
-func (l *Logger) Warn(v ...any) {
+func (l *logger) Warn(v ...any) {
        l.WithLevel(WARNING).Print(v...)
 }
 
-func (l *Logger) Warnf(fmtstr string, v ...any) {
+func (l *logger) Warnf(fmtstr string, v ...any) {
        l.WithLevel(WARNING).Printf(fmtstr, v...)
 }
 
-func (l *Logger) Error(v ...any) {
+func (l *logger) Error(v ...any) {
        l.WithLevel(ERROR).Print(v...)
 }
 
-func (l *Logger) Errorf(fmtstr string, v ...any) {
+func (l *logger) Errorf(fmtstr string, v ...any) {
        l.WithLevel(ERROR).Printf(fmtstr, v...)
 }
 
-func (l *Logger) Critical(v ...any) {
+func (l *logger) Critical(v ...any) {
        l.WithLevel(CRITICAL).Print(v...)
 }
 
-func (l *Logger) Criticalf(fmtstr string, v ...any) {
+func (l *logger) Criticalf(fmtstr string, v ...any) {
        l.WithLevel(CRITICAL).Printf(fmtstr, v...)
 }
 
-func (l *Logger) Alert(v ...any) {
+func (l *logger) Alert(v ...any) {
        l.WithLevel(ALERT).Print(v...)
 }
 
-func (l *Logger) Alertf(fmtstr string, v ...any) {
+func (l *logger) Alertf(fmtstr string, v ...any) {
        l.WithLevel(ALERT).Printf(fmtstr, v...)
 }
-
-func (l *Logger) Fatal(v ...any) {
-       if len(v) > 0 {
-               if arg1, ok := v[0].(string); ok {
-                       if l.prefix != "" {
-                               v[0] = FATAL.prefix(l.Writer()) + "[" + l.prefix + "] " + arg1
-                       }
-               }
-       }
-
-       l.Logger.Fatal(v...)
-}
-
-func (l *Logger) Fatalf(fmtstr string, v ...any) {
-       if l.prefix != "" {
-               fmtstr = FATAL.prefix(l.Writer()) + "[" + l.prefix + "] " + fmtstr
-       }
-
-       l.Logger.Fatalf(fmtstr, v...)
-}