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,6 +1,7 @@
package middleware
import (
"log/slog"
"net"
"net/http"
"time"
@@ -11,7 +12,6 @@ import (
basicauth "github.com/99designs/basicauth-go"
"github.com/go-chi/chi/middleware"
"github.com/go-chi/cors"
"github.com/rs/zerolog"
metrics "github.com/slok/go-http-metrics/metrics/prometheus"
ghmm "github.com/slok/go-http-metrics/middleware"
"github.com/slok/go-http-metrics/middleware/std"
@@ -27,7 +27,7 @@ type MiddlewareParams struct {
}
type Middleware struct {
log *zerolog.Logger
log *slog.Logger
params *MiddlewareParams
}
@@ -38,9 +38,6 @@ func New(lc fx.Lifecycle, params MiddlewareParams) (*Middleware, error) {
return s, nil
}
// the following is from
// https://learning-cloud-native-go.github.io/docs/a6.adding_zerolog_logger/
func ipFromHostPort(hp string) string {
h, _, err := net.SplitHostPort(hp)
if err != nil {
@@ -70,7 +67,6 @@ func (lrw *loggingResponseWriter) WriteHeader(code int) {
// this returns a Middleware that is designed to do every request through the
// mux, note the signature:
func (s *Middleware) Logging() func(http.Handler) http.Handler {
// FIXME this should use https://github.com/google/go-cloud/blob/master/server/requestlog/requestlog.go
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
@@ -78,18 +74,18 @@ func (s *Middleware) Logging() func(http.Handler) http.Handler {
ctx := r.Context()
defer func() {
latency := time.Since(start)
s.log.Info().
Time("request_start", start).
Str("method", r.Method).
Str("url", r.URL.String()).
Str("useragent", r.UserAgent()).
Str("request_id", ctx.Value(middleware.RequestIDKey).(string)).
Str("referer", r.Referer()).
Str("proto", r.Proto).
Str("remoteIP", ipFromHostPort(r.RemoteAddr)).
Int("status", lrw.statusCode).
Int("latency_ms", int(latency.Milliseconds())).
Send()
s.log.InfoContext(ctx, "request",
"request_start", start,
"method", r.Method,
"url", r.URL.String(),
"useragent", r.UserAgent(),
"request_id", ctx.Value(middleware.RequestIDKey).(string),
"referer", r.Referer(),
"proto", r.Proto,
"remoteIP", ipFromHostPort(r.RemoteAddr),
"status", lrw.statusCode,
"latency_ms", latency.Milliseconds(),
)
}()
next.ServeHTTP(lrw, r)
@@ -116,7 +112,7 @@ func (s *Middleware) Auth() func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// CHANGEME you'll want to change this to do stuff.
s.log.Info().Msg("AUTH: before request")
s.log.Info("AUTH: before request")
next.ServeHTTP(w, r)
})
}