Günlükleme ve İstek Kimliği Ara Katmanı
Yapılandırılmış günlükleme ve iz kimliği enjeksiyonu
Günlükleme ve İstek Kimliği Ara Katmanı, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Go Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Go Academy kursu toplamda 4 dersten oluşur.
Yapılandırılmış günlükleme neden gereklidir?
Düz metin günlüklerini büyük ölçekte ayrıştırmak zordur. Yapılandırılmış günlükleme (JSON veya key=value), günlük toplayıcılarının (Datadog, Loki, ELK) girdileri alana göre filtrelemesine ve ilişkilendirmesine olanak tanır.
İstek kimliği oluşturma
Ara yazılımda her istek için benzersiz bir kimlik (UUID veya ULID) oluşturun ve bunu yanıt üst bilgisine ve bağlama ekleyin:
func RequestID(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
id := r.Header.Get("X-Request-ID")
if id == "" { id = uuid.New().String() }
w.Header().Set("X-Request-ID", id)
ctx := context.WithValue(r.Context(), reqIDKey{}, id)
next.ServeHTTP(w, r.WithContext(ctx))
})
}slog ile günlükleme ara yazılımı
Go 1.21, yapılandırılmış günlükleme için log/slog ekledi. Bunu ara yazılım içinde kullanın:
func StructuredLogger(logger *slog.Logger) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
cw := &captureWriter{ResponseWriter: w}
next.ServeHTTP(cw, r)
logger.Info("request",
"method", r.Method,
"path", r.URL.Path,
"status", cw.status,
"latency_ms", time.Since(start).Milliseconds(),
"request_id", r.Context().Value(reqIDKey{}),
)
})
}
}captureWriter
İşleyici tarafından yazılan durum kodunu yakalamak için ResponseWriter'ı sarın:
type captureWriter struct {
http.ResponseWriter
status int
}
func (cw *captureWriter) WriteHeader(code int) {
cw.status = code
cw.ResponseWriter.WriteHeader(code)
}
func (cw *captureWriter) Status() int {
if cw.status == 0 { return http.StatusOK }
return cw.status
}Her günlük satırına istek kimliği ekleme
Kimliği önceden eklenmiş bir alt günlükleyici oluşturarak istek başına bir günlükleyici oluşturun, ardından bunu bağlamda depolayın:
reqLogger := logger.With("request_id", id)
ctx := context.WithValue(r.Context(), loggerKey{}, reqLogger)Günlükleyiciyi bağlamdan alma
Herhangi bir işleyiciden veya hizmetten istek kapsamındaki günlükleyiciyi almak için yardımcı işlev:
func LoggerFromContext(ctx context.Context) *slog.Logger {
l, ok := ctx.Value(loggerKey{}).(*slog.Logger)
if !ok { return slog.Default() }
return l
}Günlük düzeyleri
Uygun düzeyleri kullanın: Geliştirme ayrıntıları için Debug, istek özetleri için Info, kurtarılabilir anormallikler için Warn, işlem gerektiren başarısızlıklar için Error. Hassas alanları (belirteçler, parolalar) günlüğe kaydetmeyin.
Gecikme aralıkları
Her günlük satırına istek gecikmesini ekleyin. P50/P95/P99 yüzdeliklerini izlemek için bunları ölçüm sisteminizdeki (Prometheus) histogram aralıklarında toplayın.
Mikro hizmetlerde korelasyon kimlikleri
Dağıtık izlemeyi tam kapsamlı bir izleme sistemi olmadan etkinleştirmek için gelen isteklerdeki X-Request-ID üst bilgisini giden tüm HTTP ve gRPC çağrılarına iletin.
Günlük örnekleme
Yüksek trafikli hizmetlerde, depolama maliyetlerini azaltırken hata günlüklerini eksiksiz tutmak için hata ayıklama ve bilgi günlüklerinden örnekler alın (örneğin, hata ayıklama düzeyinde her 100 isteğin 1'ini günlüğe kaydedin).
zap ve slog karşılaştırması
zap (Uber), yüksek aktarım hızına sahip hizmetlerde slog'dan daha hızlıdır ancak daha fazla kurulum gerektirir. slog standart kitaplığın bir parçasıdır, taşınabilirdir ve çoğu hizmet için yeterlidir. Karşılaştırmalı ölçümler bir darboğaz göstermedikçe slog'u tercih edin.
Hızlı kontrol
Günlükleme ara yazılımında neden bir captureWriter gerekir?
Özet: Günlükleme ve istek kimliği
Ana noktalar:
- Ara yazılımda X-Request-ID oluşturun veya iletin; bunu bağlamda saklayın
- Anahtar-değer alanlarıyla yapılandırılmış günlükler için slog kullanın
- captureWriter, işleyici sonrası günlükleme için durum kodunu yakalar
- Korelasyon kimliğini aşağı akıştaki tüm çağrılara iletin
Yapay zeka eğitmeniyle Go öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 51
- Dersler
- 203
Sıkça Sorulan Sorular
“Günlükleme ve İstek Kimliği Ara Katmanı” dersi ücretsiz mi?
Evet — “Günlükleme ve İstek Kimliği Ara Katmanı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Go Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Go Academy kursu toplamda 4 dersten oluşur.
“Günlükleme ve İstek Kimliği Ara Katmanı” dersinde ne öğreneceğim?
Yapılandırılmış günlükleme ve iz kimliği enjeksiyonu Go Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Go Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Go Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Günlükleme ve İstek Kimliği Ara Katmanı” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Go Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Go Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- HTTP Ara Katman Zincirinin Temelleri
- Günlükleme ve İstek Kimliği Ara Katmanı
- Kimlik Doğrulama ve Hız Sınırlama Ara Katmanı
- CORS ve Panic Kurtarma Ara Katmanı