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
package main
import (
"fmt"
"net/http"
"net/http/httptest"
)
func main() {
// buraya yaz
}Örnek çözüm
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
func (k *kayitci) ____(c int) {
k.kod = c
k.ResponseWriter.WriteHeader(c)
}
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 |