Skip to content

Commit d44e3f1

Browse files
committed
backend/middleware: add logger per request instance using AttachLogger
middleware
1 parent 01e9033 commit d44e3f1

File tree

8 files changed

+65
-36
lines changed

8 files changed

+65
-36
lines changed

backend/cmd/leviosa/logger.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import (
77
"github.com/hengadev/leviosa/pkg/serverutil/logger"
88
)
99

10-
func setLogger() (*slog.Logger, error) {
10+
// func setLogger() (*slog.Logger, error) {
11+
func setLogger() (slog.Handler, error) {
1112
if err := logger.SetOptions(opts.mode, &opts.logger.level, &opts.logger.style); err != nil {
1213
return nil, fmt.Errorf("set logger options: %w", err)
1314
}
1415
slogHandler, err := logger.SetHandler(opts.logger.level, opts.logger.style)
1516
if err != nil {
1617
return nil, fmt.Errorf("create logger handler: %w", err)
1718
}
18-
logger := slog.New(slogHandler)
19-
return logger, nil
19+
return slogHandler, nil
2020
}

backend/cmd/leviosa/run.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import (
44
"context"
55
"fmt"
66
"io"
7+
"log/slog"
78
"os"
89
"os/signal"
910
"syscall"
1011

1112
// api
1213
"github.com/hengadev/leviosa/internal/server"
1314
"github.com/hengadev/leviosa/internal/server/app"
15+
1416
// "github.com/hengadev/leviosa/internal/server/cron"
1517
"github.com/hengadev/leviosa/pkg/config"
1618
"github.com/hengadev/leviosa/pkg/flags"
@@ -43,8 +45,9 @@ func run(ctx context.Context, w io.Writer) error {
4345
if err := setupEnvVars(); err != nil {
4446
return fmt.Errorf("failed to get env variables: %w", err)
4547
}
48+
4649
// set logger
47-
logger, err := setLogger()
50+
slogHandler, err := setLogger()
4851
if err != nil {
4952
return fmt.Errorf("failed to setup logger: %w", err)
5053
}
@@ -73,7 +76,8 @@ func run(ctx context.Context, w io.Writer) error {
7376
appCtx := app.New(&appSvcs, &appRepos)
7477
srv := server.New(
7578
appCtx,
76-
logger,
79+
opts.mode,
80+
slogHandler,
7781
server.WithPort(opts.server.port),
7882
)
7983
var srvErrCh = make(chan error)
@@ -88,7 +92,7 @@ func run(ctx context.Context, w io.Writer) error {
8892
// }()
8993

9094
go func() {
91-
logger.Info(fmt.Sprintf("Running server on port %d...", opts.server.port))
95+
slog.InfoContext(ctx, fmt.Sprintf("Server running on port %d.", opts.server.port))
9296
if err := srv.ListenAndServe(); err != nil {
9397
srvErrCh <- fmt.Errorf("launch server: %w", err)
9498
return

backend/internal/server/middleware/logging.go

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,40 @@ import (
66
"math/rand"
77
"net/http"
88
"os"
9+
"slices"
910
"time"
1011

1112
"github.com/hengadev/leviosa/pkg/contextutil"
1213
"github.com/hengadev/leviosa/pkg/domainutil"
14+
mode "github.com/hengadev/leviosa/pkg/flags"
1315
)
1416

15-
func AttachLogger(logger *slog.Logger) func(http.Handler) http.Handler {
17+
func AttachLogger(env mode.EnvMode, slogHandler slog.Handler) func(http.Handler) http.Handler {
1618
return func(next http.Handler) http.Handler {
1719
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
20+
skipLogging := []string{
21+
"/healthz",
22+
}
23+
if slices.Contains(skipLogging, r.URL.Path) {
24+
next.ServeHTTP(w, r)
25+
return
26+
}
1827
ctx := r.Context()
19-
start := time.Now()
2028

2129
requestID := rand.Int63()
2230

2331
// I just make a fake IP for now, I know my function to work:
24-
IP := "127.0.0.1"
25-
// TODO: use the getCgetClientIP function instead
26-
// IP := r.Header.Get("X-Client-IP")
32+
var IP string
33+
switch env {
34+
case mode.ModeDev:
35+
IP = "127.0.0.1"
36+
case mode.ModeStaging, mode.ModeProd:
37+
// TODO: fix that one later with getting the right header for the IP address
38+
header := r.Header
39+
_ = header
40+
IP = "127.0.0.1"
41+
}
42+
2743
if IP == "" {
2844
slog.ErrorContext(ctx, "client IP not found with required header")
2945
http.Error(w, "Cannot determine Client IP", http.StatusBadRequest)
@@ -32,13 +48,15 @@ func AttachLogger(logger *slog.Logger) func(http.Handler) http.Handler {
3248

3349
loggingSalt := os.Getenv("LOGGING_SALT")
3450
if loggingSalt == "" {
35-
slog.ErrorContext(ctx, "logging salt not found in environment variables")
51+
slog.ErrorContext(ctx, "LOGGING_SALT not found in environment variables")
3652
http.Error(w, "Missing environment variable: LOGGING_SALT", http.StatusInternalServerError)
3753
return
3854
}
3955

4056
hashedIP := domainutil.HashWithSalt(IP, loggingSalt)
4157

58+
logger := slog.New(slogHandler)
59+
4260
logger = logger.With(
4361
"method", r.Method,
4462
"URL", r.URL.String(),
@@ -49,7 +67,7 @@ func AttachLogger(logger *slog.Logger) func(http.Handler) http.Handler {
4967
ctx = context.WithValue(r.Context(), contextutil.LoggerKey, logger)
5068

5169
logger.InfoContext(ctx, "Request started")
52-
70+
start := time.Now()
5371
next.ServeHTTP(w, r.WithContext(ctx))
5472
duration := time.Since(start)
5573
logger.InfoContext(ctx, "Request completed", "duration", duration)

backend/internal/server/middleware/rate_limiter.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package middleware
22

33
import (
44
"fmt"
5-
"net"
5+
// "net"
66
"net/http"
77
"os"
88

@@ -68,14 +68,14 @@ func PerIPRateLimit(lim, burst int) Middleware {
6868
}
6969
}
7070

71-
// getClientIP retrieves the client IP set in the custom header 'X-Client-IP'. It returns an empty string if the IP address sent is invalid, unknown or could ne be parsed.
72-
func getClientIP(r *http.Request) string {
73-
clientIP := r.Header.Get("X-Client-IP")
74-
if clientIP == "" || clientIP == "unknown" {
75-
return ""
76-
}
77-
if ip := net.ParseIP(clientIP); ip == nil {
78-
return ""
79-
}
80-
return clientIP
81-
}
71+
// // getClientIP retrieves the client IP set in the custom header 'X-Client-IP'. It returns an empty string if the IP address sent is invalid, unknown or could ne be parsed.
72+
// func getClientIP(r *http.Request) string {
73+
// clientIP := r.Header.Get("X-Client-IP")
74+
// if clientIP == "" || clientIP == "unknown" {
75+
// return ""
76+
// }
77+
// if ip := net.ParseIP(clientIP); ip == nil {
78+
// return ""
79+
// }
80+
// return clientIP
81+
// }

backend/internal/server/middleware/user_context.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,6 @@ func SetUserContext(sessionGetter sessionGetterFunc) func(http.Handler) http.Han
1515
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
1616
ctx := r.Context()
1717

18-
logger, ok := ctx.Value(contextutil.LoggerKey).(*slog.Logger)
19-
if !ok {
20-
slog.ErrorContext(ctx, "logger not found in context")
21-
http.Error(w, "logger not found in context", http.StatusInternalServerError)
22-
return
23-
}
24-
2518
exceptPath := []string{
2619
"/healthz",
2720
"/user/register",
@@ -35,6 +28,13 @@ func SetUserContext(sessionGetter sessionGetterFunc) func(http.Handler) http.Han
3528
return
3629
}
3730

31+
logger, ok := ctx.Value(contextutil.LoggerKey).(*slog.Logger)
32+
if !ok {
33+
slog.ErrorContext(ctx, "logger not found in context")
34+
http.Error(w, "logger not found in context", http.StatusInternalServerError)
35+
return
36+
}
37+
3838
// get session ID from request
3939
sessionID, err := getSessionIDFromRequest(r)
4040
if err != nil {

backend/internal/server/routes.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,7 @@ func (s *Server) addRoutes(h *app.App) {
8282
// TODO: how can I make groups for that thing and make sure that I can add as much middleware to a group as I want ?
8383

8484
func healthz(w http.ResponseWriter, r *http.Request) {
85-
w.WriteHeader(http.StatusOK)
86-
fmt.Fprintln(w, "OK")
85+
w.Write([]byte("OK"))
8786
}
8887

8988
func handleImage(w http.ResponseWriter, r *http.Request) {

backend/internal/server/server.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,20 @@ import (
88

99
"github.com/hengadev/leviosa/internal/server/app"
1010
mw "github.com/hengadev/leviosa/internal/server/middleware"
11+
mode "github.com/hengadev/leviosa/pkg/flags"
1112
)
1213

1314
type Server struct {
1415
srv *http.Server
1516
}
1617

17-
func New(appCtx *app.App, logger *slog.Logger, opts ...ServerOption) *Server {
18+
func New(
19+
appCtx *app.App,
20+
env mode.EnvMode,
21+
slogHandler slog.Handler,
22+
opts ...ServerOption,
23+
) *Server {
24+
1825
// build server with default options.
1926
server := &Server{
2027
srv: &http.Server{
@@ -37,7 +44,7 @@ func New(appCtx *app.App, logger *slog.Logger, opts ...ServerOption) *Server {
3744
// add middlewares common to all routes. [Order important]
3845
server.Use(
3946
mw.SetUserContext(appCtx.Svcs.Session.GetSession),
40-
mw.AttachLogger(logger),
47+
mw.AttachLogger(env, slogHandler),
4148
mw.SetOrigin,
4249
)
4350
return server

compose.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ services:
5454
interval: 30s
5555
timeout: 10s
5656
retries: 3
57+
start_period: 10s
5758

5859
redis:
5960
image: redis:latest

0 commit comments

Comments
 (0)