Structured Logging for Cloud
Bulut uchun strukturaviy loglash
"Logging with slog" kursida strukturaviy loglashning asosini ko'rgan edingiz. Bulut muhitida bitta qo'shimcha talab bor: sizning bitta so'rovingiz ko'pincha bir nechta mikroservisdan o'tishi mumkin, va agar biror joyda xato yuz bersa, uni butun zanjir bo'ylab kuzatib borish kerak bo'ladi.
package main
import (
"context"
"log/slog"
"os"
)
type ctxKey string
const traceIDKey ctxKey = "trace_id"
func withTraceID(ctx context.Context, id string) context.Context {
return context.WithValue(ctx, traceIDKey, id)
}
func logWithTrace(ctx context.Context, logger *slog.Logger, msg string) {
traceID, _ := ctx.Value(traceIDKey).(string)
logger.Info(msg, "trace_id", traceID)
}
func main() {
opts := &slog.HandlerOptions{
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
if a.Key == slog.TimeKey {
return slog.Attr{}
}
return a
},
}
logger := slog.New(slog.NewJSONHandler(os.Stdout, opts))
ctx := withTraceID(context.Background(), "req-abc-123")
logWithTrace(ctx, logger, "so'rov qabul qilindi")
}context.WithValue — "Context Package" darsida ko'rgan context.WithTimeout/WithCancelga o'xshash, lekin bu safar vaqt chegarasi emas, ma'lumot (trace_id) tashiydi. Bu "trace ID" — bitta foydalanuvchi so'rovi tizim bo'ylab qanday yo'l bosib o'tganini kuzatish uchun unikal identifikator: u so'rov kirib kelganda yaratiladi va so'rov qaysi funksiyaga, qaysi servisga o'tsa ham, context orqali birga "olib yuriladi".
Natijada, agar keyinroq "req-abc-123" bilan bog'liq barcha loglarni ko'rmoqchi bo'lsangiz (masalan xato tergovi uchun), log aggregator tizimida ("Build a Log Aggregator" loyihasida quradigan turdagi tizim) shu trace_id bo'yicha qidirish kifoya — butun so'rovning "hayoti"ni, hatto u bir necha mikroservisdan o'tgan bo'lsa ham, bitta joyda ko'rish mumkin bo'ladi. Bu — "Distributed Tracing Basics" darsida (Microservices kursida) chuqurroq ko'radigan g'oyaning asosi.
>_ Exercise
Ikkita turli trace_id bilan log yozib, ularni solishtiring.
- •"req-1" va "req-2" trace ID'lari bilan ikkita context yarating
- •har biriga logWithTrace bilan "ishlov berildi" xabarini yozing
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
context.WithValue orqali trace ID'ni so'rov bo'ylab "olib yurish" va har bir log yozuviga qo'shish — taqsimlangan tizimlarda bitta so'rovning to'liq "hayotini" kuzatish imkonini beradi.
NEXT UP
Metrics & Observability: Concepts (Part 1)
$ go run main.go
Kodingizni ishga tushiring