Skip to content

Commit b9e0ab4

Browse files
committed
fix: always log certificate issuance regardless of verbosity level
The cert audit logger used slog.Info but the default log level is Warn, so certificate issuance events were silently dropped unless -v was passed. Wrap the handler to force Info-level minimum for audit logging.
1 parent 1112d56 commit b9e0ab4

1 file changed

Lines changed: 36 additions & 1 deletion

File tree

cmd/epithet/ca.go

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"context"
45
"fmt"
56
"log/slog"
67
"os"
@@ -53,7 +54,8 @@ func (c *CACLI) Run(logger *slog.Logger, tlsCfg tlsconfig.Config) error {
5354
r.Use(middleware.Timeout(60 * time.Second))
5455

5556
// Create certificate logger for audit trail.
56-
certLogger := caserver.NewSlogCertLogger(logger)
57+
// Audit logs always emit at Info regardless of global verbosity.
58+
certLogger := caserver.NewSlogCertLogger(certAuditLogger(logger))
5759

5860
server := caserver.New(caInstance, logger, nil, certLogger)
5961
r.Handle("/", server.Handler())
@@ -62,3 +64,36 @@ func (c *CACLI) Run(logger *slog.Logger, tlsCfg tlsconfig.Config) error {
6264
logger.Info("listening", "address", c.Listen)
6365
return listenAndServe(c.Listen, r)
6466
}
67+
68+
// certAuditLogger returns a logger that emits at Info or below, regardless of
69+
// the parent logger's level. Audit events like certificate issuance must
70+
// always be logged.
71+
func certAuditLogger(parent *slog.Logger) *slog.Logger {
72+
return slog.New(&minLevelHandler{
73+
inner: parent.Handler(),
74+
minLevel: slog.LevelInfo,
75+
})
76+
}
77+
78+
// minLevelHandler wraps an slog.Handler, overriding Enabled to accept
79+
// records at or above minLevel even if the inner handler would suppress them.
80+
type minLevelHandler struct {
81+
inner slog.Handler
82+
minLevel slog.Level
83+
}
84+
85+
func (h *minLevelHandler) Enabled(_ context.Context, level slog.Level) bool {
86+
return level >= h.minLevel
87+
}
88+
89+
func (h *minLevelHandler) Handle(ctx context.Context, r slog.Record) error {
90+
return h.inner.Handle(ctx, r)
91+
}
92+
93+
func (h *minLevelHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
94+
return &minLevelHandler{inner: h.inner.WithAttrs(attrs), minLevel: h.minLevel}
95+
}
96+
97+
func (h *minLevelHandler) WithGroup(name string) slog.Handler {
98+
return &minLevelHandler{inner: h.inner.WithGroup(name), minLevel: h.minLevel}
99+
}

0 commit comments

Comments
 (0)