rctx/readme.md

1.6 KiB

How to

At the middleware

func (h *Handler) LogMW(next http.HandlerFunc) http.HandlerFunc {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		var (
			ctx      context.Context = rctx.AssignRequestID(r.Context())
			rWithCtx *http.Request   = r.WithContext(ctx)

			reqID  string = rctx.GetRequestID(ctx)
			values        = r.URL.Query()

			attrs []slog.Attr = []slog.Attr{
				slog.String("req id", reqID),
				slog.String("method", r.Method),
				slog.String("URI", r.RequestURI),
				slog.String("remote", r.RemoteAddr),
			}
		)

		// Append query params as logger info:
		for i, value := range values {
			switch {
			case len(value) == 1:
				attrs = append(attrs, slog.Attr{
					Key:   i,
					Value: slog.StringValue(value[0]),
				})
			case len(value) > 1:
				attrs = append(attrs, slog.Attr{
					Key:   i,
					Value: slog.AnyValue(value),
				})
			}
		}

		h.log.LogAttrs(
			rWithCtx.Context(),
			slog.LevelInfo,
			"request called",
			attrs...,
		)

		next.ServeHTTP(w, rWithCtx)

		slog.Debug("request handled",
			slog.String("request ID", reqID))
	})
}

At the http Handler

func HandleSomething(w http.ResponseWriter, r *http.Request) {
	var (
		ctx   context.Context = r.Context()
		reqID string          = rctx.GetRequestID(ctx)
		log   *slog.Logger    = slog.Default().With(
            slog.String("req id", reqID),
            slog.String("level", "handler"),
        )
	)

    // do something and where is the case to log w/ req id:
		log.Error("decode req body",
			slog.String("error", err.Error()))
    return
}