CodeBlanks Logo Icon CodeBlanks

Logging middleware

  • Go kursu
  • İleri seviye
  • Ders 34/68
  • 4 dk

İstekleri loglayan bir middleware yazmayı öğrenirsin.

Logging middleware

İstek yöntemi, yolu ve süresi kolayca kaydedilir; ama durum kodu için ResponseWriter'ı sarmak gerekir, çünkü işleyicinin hangi kodu yazdığını standart arayüz söylemez:

type kayitci struct {
    http.ResponseWriter
    kod int
}

func (k *kayitci) WriteHeader(c int) {
    k.kod = c
    k.ResponseWriter.WriteHeader(c)
}

slog ile yapılandırılmış log

Go 1.21'in log/slog paketiyle alanlar ayrı ayrı kaydedilir; log arama araçları bunları sorgulayabilir:

k := &kayitci{ResponseWriter: w, kod: 200}
bas := time.Now()
next.ServeHTTP(k, r)
slog.Info("istek", "yol", r.URL.Path, "kod", k.kod, "sure", time.Since(bas))

Uygulama Durum kodunu kaydet

kayitci türünü (gömülü http.ResponseWriter ve kod int) ve WriteHeader yöntemini yaz. İşleyici w.WriteHeader(404) çağırsın; işleyiciyi k := &kayitci{ResponseWriter: rec, kod: 200} ile çalıştırıp k.kod değerini yazdır.

Başlangıç kodu

main.go
package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
)

type kayitci struct {
    http.ResponseWriter
    kod int
}

func (k *kayitci) WriteHeader(c int) {
    k.kod = c
    k.ResponseWriter.WriteHeader(c)
}

func main() {
    rec := httptest.NewRecorder()
    k := &kayitci{ResponseWriter: rec, kod: 200}
    h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(404) })
    h.ServeHTTP(k, httptest.NewRequest("GET", "/yok", nil))
    fmt.Println(k.kod)
}

Beklenen çıktı

404

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 İşleyici <code>WriteHeader</code> hiç çağırmazsa durum kodu nedir?

  • 200 Doğru cevap
  • 0
  • 404
  • 500

Açıklama: İlk Write çağrısı örtük olarak 200 yazar; bu yüzden kayıtçı kod alanını 200 ile başlatır.

2 Kodu yakala

Soru
func (k *kayitci) ____(c int) {
    k.kod = c
    k.ResponseWriter.WriteHeader(c)
}
Cevap
func (k *kayitci) WriteHeader(c int) {
    k.kod = c
    k.ResponseWriter.WriteHeader(c)
}

Açıklama: WriteHeader'ı yeniden tanımlayarak işleyicinin yazdığı durum kodu yakalanır.

3 Log alanları

Kavram Anlamı
r.Method GET, POST...
r.URL.Path İstek yolu
k.kod Durum kodu
time.Since Süre

İleri seviye bölümündeki tüm dersler