all repos

onasty @ 4fabec7

a one-time notes service

onasty/internal/transport/http/middlewares.go (view raw)

Smirnov Oleksandr Smirnov Oleksandr
ss2316544@gmail.com
feat: metrics (#24)..., 1 year ago
1
package http
2
3
import (
4
	"log/slog"
5
	"time"
6
7
	"github.com/gin-gonic/gin"
8
)
9
10
func (t *Transport) logger() gin.HandlerFunc {
11
	return func(c *gin.Context) {
12
		start := time.Now()
13
		path := c.Request.URL.Path
14
		raw := c.Request.URL.RawQuery
15
16
		c.Next()
17
		latency := time.Since(start)
18
19
		if raw != "" {
20
			path = path + "?" + raw
21
		}
22
23
		lvl := slog.LevelInfo
24
		if c.Writer.Status() >= 400 {
25
			lvl = slog.LevelError
26
		}
27
28
		slog.LogAttrs(
29
			c.Request.Context(),
30
			lvl,
31
			c.Errors.ByType(gin.ErrorTypePrivate).String(),
32
			slog.String("latency", latency.String()),
33
			slog.String("method", c.Request.Method),
34
			slog.Int("status_code", c.Writer.Status()),
35
			slog.String("path", path),
36
			slog.String("client_ip", c.ClientIP()),
37
			slog.Int("body_size", c.Writer.Size()),
38
		)
39
	}
40
}