Replace zap with slog
This commit is contained in:
@@ -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"),
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user