Replace zap with slog

This commit is contained in:
2025-03-19 23:16:38 +01:00
parent 49553fa965
commit 46d9f4d64a
9 changed files with 70 additions and 91 deletions

View File

@@ -3,6 +3,7 @@ package main
import (
"context"
"fmt"
"log/slog"
"net/http"
"os"
"os/signal"
@@ -17,8 +18,6 @@ import (
"github.com/coreos/go-systemd/daemon"
sshlib "github.com/gliderlabs/ssh"
"github.com/urfave/cli/v2"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"golang.org/x/crypto/acme/autocert"
)
@@ -55,17 +54,17 @@ func ActionServe(c *cli.Context) error {
// Setup logging
loggers := setupLoggers(cfg)
loggers.rootLogger.Infow("Starting apiary.", "version", apiary.FullVersion())
loggers.rootLogger.Info("Starting apiary.", "version", apiary.FullVersion())
// Setup store
var s store.LoginAttemptStore
switch cfg.Store.Type {
case "MEMORY", "memory":
loggers.rootLogger.Infow("Initialized store.", "store_type", "memory")
loggers.rootLogger.Info("Initialized store.", "store_type", "memory")
s = &store.MemoryStore{}
case "POSTGRES", "postgres":
pgStartTime := time.Now()
loggers.rootLogger.Debugw("Initializing store.", "store_type", "postgres")
loggers.rootLogger.Debug("Initializing store.", "store_type", "postgres")
pgStore, err := store.NewPostgresStore(cfg.Store.Postgres.DSN)
if err != nil {
return err
@@ -73,33 +72,33 @@ func ActionServe(c *cli.Context) error {
if err := pgStore.InitDB(); err != nil {
return err
}
loggers.rootLogger.Infow("Initialized store.", "store_type", "postgres", "init_time", time.Since(pgStartTime))
loggers.rootLogger.Info("Initialized store.", "store_type", "postgres", "init_time", time.Since(pgStartTime))
if cfg.Store.EnableCache {
loggers.rootLogger.Debugw("Initializing store.", "store_type", "cache-postgres")
loggers.rootLogger.Debug("Initializing store.", "store_type", "cache-postgres")
startTime := time.Now()
cachingStore := store.NewCachingStore(pgStore)
s = cachingStore
loggers.rootLogger.Infow("Initialized store.", "store_type", "cache-postgres", "init_time", time.Since(startTime))
loggers.rootLogger.Info("Initialized store.", "store_type", "cache-postgres", "init_time", time.Since(startTime))
} else {
s = pgStore
}
case "bolt", "BOLT":
boltStartTime := time.Now()
loggers.rootLogger.Debugw("Initializing store.", "store_type", "bolt")
loggers.rootLogger.Debug("Initializing store.", "store_type", "bolt")
boltStore, err := store.NewBBoltStore(cfg.Store.Bolt.DBPath)
if err != nil {
return err
}
defer boltStore.Close()
loggers.rootLogger.Infow("Initialized store.", "store_type", "bolt", "init_time", time.Since(boltStartTime))
loggers.rootLogger.Info("Initialized store.", "store_type", "bolt", "init_time", time.Since(boltStartTime))
if cfg.Store.EnableCache {
loggers.rootLogger.Debugw("Initializing store.", "store_type", "cache-bolt")
loggers.rootLogger.Debug("Initializing store.", "store_type", "cache-bolt")
startTime := time.Now()
cachingStore := store.NewCachingStore(boltStore)
s = cachingStore
loggers.rootLogger.Infow("Initialized store.", "store_type", "cache-bolt", "init_time", time.Since(startTime))
loggers.rootLogger.Info("Initialized store.", "store_type", "cache-bolt", "init_time", time.Since(startTime))
} else {
s = boltStore
}
@@ -153,18 +152,18 @@ func ActionServe(c *cli.Context) error {
// Start ssh server
go func() {
loggers.rootLogger.Infow("Starting SSH server.", "addr", cfg.Honeypot.ListenAddr)
loggers.rootLogger.Info("Starting SSH server.", "addr", cfg.Honeypot.ListenAddr)
if err := hs.ListenAndServe(); err != nil && err != sshlib.ErrServerClosed {
loggers.rootLogger.Warnw("SSH server returned error.", "error", err)
loggers.rootLogger.Warn("SSH server returned error.", "error", err)
}
loggers.rootLogger.Infow("SSH server stopped.")
loggers.rootLogger.Info("SSH server stopped.")
}()
// Start web server
go func() {
loggers.rootLogger.Infow("Starting web server.", "addr", cfg.Frontend.ListenAddr)
loggers.rootLogger.Info("Starting web server.", "addr", cfg.Frontend.ListenAddr)
if err := web.StartServe(); err != nil && err != http.ErrServerClosed {
loggers.rootLogger.Warnw("Web server returned error.", "error", err)
loggers.rootLogger.Warn("Web server returned error.", "error", err)
}
}()
@@ -184,7 +183,7 @@ func ActionServe(c *cli.Context) error {
return
}
if err != nil {
loggers.rootLogger.Warnw("Unable to connect to NOTIFY_SOCKET.", "error", err)
loggers.rootLogger.Warn("Unable to connect to NOTIFY_SOCKET.", "error", err)
return
}
loggers.rootLogger.Debug("Sent READY=1 to NOTIFY_SOCKET.")
@@ -192,11 +191,11 @@ func ActionServe(c *cli.Context) error {
// Setup timer
timeout, err := daemon.SdWatchdogEnabled(false)
if err != nil {
loggers.rootLogger.Warnw("Unable to get watchdog timeout.", "error", err)
loggers.rootLogger.Warn("Unable to get watchdog timeout.", "error", err)
return
}
if timeout == 0 {
loggers.rootLogger.Infow("Systemd watchdog not enabled.")
loggers.rootLogger.Info("Systemd watchdog not enabled.")
return
}
@@ -209,14 +208,14 @@ func ActionServe(c *cli.Context) error {
case <-ticker.C:
if healthy == nil {
if _, err := daemon.SdNotify(false, daemon.SdNotifyWatchdog); err != nil {
loggers.rootLogger.Warnw("Error notifying watchdog.", "err", err)
loggers.rootLogger.Warn("Error notifying watchdog.", "err", err)
}
continue
}
// TODO: If unhealthy, should we retry healthcheck immediately, otherwise service will most likely get killed by watchdog.
loggers.rootLogger.Errorw("Store reported not healthy, might get killed by watchdog.", "err", healthy)
loggers.rootLogger.Error("Store reported not healthy, might get killed by watchdog.", "err", healthy)
case <-notifyCtx.Done():
loggers.rootLogger.Debugw("Notify context cancelled.")
loggers.rootLogger.Debug("Notify context cancelled.")
return
}
}
@@ -230,7 +229,7 @@ func ActionServe(c *cli.Context) error {
defer sshShutdownCancel()
loggers.rootLogger.Info("SSH server shutdown started.")
if err := hs.Shutdown(sshShutdownCtx); err != nil {
loggers.rootLogger.Infow("Error shutting down SSH server.", "error", err)
loggers.rootLogger.Info("Error shutting down SSH server.", "error", err)
}
loggers.rootLogger.Info("SSH server shutdown complete.")
@@ -240,7 +239,7 @@ func ActionServe(c *cli.Context) error {
loggers.rootLogger.Info("Web server shutdown started.")
if err := web.Shutdown(webShutdownCtx); err != nil {
loggers.rootLogger.Infow("Error shutting down web server.", "error", err)
loggers.rootLogger.Info("Error shutting down web server.", "error", err)
}
loggers.rootLogger.Info("Web server shutdown complete.")
rootCancel()
@@ -252,49 +251,36 @@ func ActionServe(c *cli.Context) error {
}
type loggerCollection struct {
rootLogger *zap.SugaredLogger
honeypotLogger *zap.SugaredLogger
webAccessLogger *zap.SugaredLogger
webServerLogger *zap.SugaredLogger
rootLogger *slog.Logger
honeypotLogger *slog.Logger
webAccessLogger *slog.Logger
webServerLogger *slog.Logger
}
func setupLoggers(cfg config.Config) *loggerCollection {
logEncoderCfg := zap.NewProductionEncoderConfig()
logEncoderCfg.EncodeCaller = func(caller zapcore.EntryCaller, enc zapcore.PrimitiveArrayEncoder) {}
var level zap.AtomicLevel
opts := &slog.HandlerOptions{}
switch strings.ToUpper(cfg.Honeypot.LogLevel) {
case "INFO":
level = zap.NewAtomicLevelAt(zap.InfoLevel)
opts.Level = slog.LevelInfo
case "DEBUG":
level = zap.NewAtomicLevelAt(zap.DebugLevel)
opts.Level = slog.LevelDebug
opts.AddSource = true
case "WARN", "WARNING":
level = zap.NewAtomicLevelAt(zap.WarnLevel)
opts.Level = slog.LevelWarn
case "ERR", "ERROR":
level = zap.NewAtomicLevelAt(zap.WarnLevel)
opts.Level = slog.LevelError
default:
level = zap.NewAtomicLevelAt(zap.InfoLevel)
}
logEncoderCfg.EncodeLevel = zapcore.CapitalColorLevelEncoder
logEncoderCfg.EncodeTime = zapcore.ISO8601TimeEncoder
logEncoderCfg.EncodeDuration = zapcore.StringDurationEncoder
rootLoggerCfg := &zap.Config{
Level: level,
OutputPaths: []string{"stdout"},
ErrorOutputPaths: []string{"stderr"},
Encoding: "console",
EncoderConfig: logEncoderCfg,
}
rootLogger, err := rootLoggerCfg.Build()
if err != nil {
panic(err)
opts.Level = slog.LevelInfo
}
handler := slog.NewTextHandler(os.Stdout, opts)
rootLogger := slog.New(handler)
return &loggerCollection{
rootLogger: rootLogger.Named("APP").Sugar(),
honeypotLogger: rootLogger.Named("HON").Sugar(),
webAccessLogger: rootLogger.Named("ACC").Sugar(),
webServerLogger: rootLogger.Named("WEB").Sugar(),
rootLogger: rootLogger.With("module", "application"),
honeypotLogger: rootLogger.With("module", "honeypot"),
webAccessLogger: rootLogger.With("module", "web-access-log"),
webServerLogger: rootLogger.With("module", "web-server"),
}
}