Replace zerolog with log/slog from stdlib

- Rewrite logger package to use slog with LevelVar for dynamic levels
- Update all packages to use *slog.Logger instead of *zerolog.Logger
- Use TextHandler for TTY (dev), JSONHandler for production
- Add make check target (runs lint + test)
- Add make test target
This commit is contained in:
2025-12-27 12:02:05 +07:00
parent a8412af0c2
commit fb347b96df
14 changed files with 76 additions and 129 deletions

View File

@@ -1,12 +1,10 @@
package logger
import (
"io"
"log/slog"
"os"
"time"
"git.eeqj.de/sneak/gohttpserver/internal/globals"
"github.com/rs/zerolog"
"go.uber.org/fx"
)
@@ -16,82 +14,56 @@ type LoggerParams struct {
}
type Logger struct {
log *zerolog.Logger
log *slog.Logger
level *slog.LevelVar
params LoggerParams
}
func New(lc fx.Lifecycle, params LoggerParams) (*Logger, error) {
l := new(Logger)
l.level = new(slog.LevelVar)
l.level.Set(slog.LevelInfo)
// always log in UTC
zerolog.TimestampFunc = func() time.Time {
return time.Now().UTC()
}
zerolog.SetGlobalLevel(zerolog.InfoLevel)
// TTY detection for dev vs prod output
tty := false
if fileInfo, _ := os.Stdout.Stat(); (fileInfo.Mode() & os.ModeCharDevice) != 0 {
tty = true
}
var writers []io.Writer
var handler slog.Handler
if tty {
// this does cool colorization for console/dev
consoleWriter := zerolog.NewConsoleWriter(
func(w *zerolog.ConsoleWriter) {
// Customize time format
w.TimeFormat = time.RFC3339Nano
},
)
writers = append(writers, consoleWriter)
// Text output for development
handler = slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: l.level,
AddSource: true,
})
} else {
// log json in prod for the machines
writers = append(writers, os.Stdout)
// JSON output for production
handler = slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: l.level,
AddSource: true,
})
}
/*
// this is how you log to a file, if you do that
// sort of thing still
logfile := viper.GetString("Logfile")
if logfile != "" {
logfileDir := filepath.Dir(logfile)
err := goutil.Mkdirp(logfileDir)
if err != nil {
log.Error().Err(err).Msg("unable to create log dir")
}
hp.logfh, err = os.OpenFile(logfile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
panic("unable to open logfile: " + err.Error())
}
writers = append(writers, hp.logfh)
*/
multi := zerolog.MultiLevelWriter(writers...)
logger := zerolog.New(multi).With().Timestamp().Logger().With().Caller().Logger()
l.log = &logger
// log.Logger = logger
l.log = slog.New(handler)
l.params = params
return l, nil
}
func (l *Logger) EnableDebugLogging() {
zerolog.SetGlobalLevel(zerolog.DebugLevel)
l.log.Debug().Bool("debug", true).Send()
l.level.Set(slog.LevelDebug)
l.log.Debug("debug logging enabled", "debug", true)
}
func (l *Logger) Get() *zerolog.Logger {
func (l *Logger) Get() *slog.Logger {
return l.log
}
func (l *Logger) Identify() {
l.log.Info().
Str("appname", l.params.Globals.Appname).
Str("version", l.params.Globals.Version).
Str("buildarch", l.params.Globals.Buildarch).
Msg("starting")
l.log.Info("starting",
"appname", l.params.Globals.Appname,
"version", l.params.Globals.Version,
"buildarch", l.params.Globals.Buildarch,
)
}