Middleware Logging dan ID Permintaan
Logging terstruktur dan penyisipan ID pelacakan
Middleware Logging dan ID Permintaan adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Mengapa pencatatan terstruktur?
Catatan teks biasa sulit diurai dalam skala besar. Pencatatan terstruktur (JSON atau key=value) memungkinkan pengumpul catatan (Datadog, Loki, ELK) memfilter dan menghubungkan entri berdasarkan bidang.
Pembuatan Request ID
Buat ID unik untuk setiap permintaan (UUID atau ULID) di perangkat tengah, lalu tambahkan ke header respons dan konteks:
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))
})
}Perangkat tengah pencatatan dengan slog
Go 1.21 menambahkan log/slog untuk pencatatan terstruktur. Gunakan di dalam perangkat tengah:
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
Bungkus ResponseWriter untuk menangkap kode status yang ditulis penangan:
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
}Menambahkan Request ID ke setiap baris catatan
Buat logger turunan untuk setiap permintaan dengan ID yang telah diisi sebelumnya, lalu simpan di dalam konteks:
reqLogger := logger.With("request_id", id)
ctx := context.WithValue(r.Context(), loggerKey{}, reqLogger)Mendapatkan Logger dari konteks
Pembantu untuk mendapatkan logger yang terkait dengan lingkup permintaan dari penangan atau layanan mana pun:
func LoggerFromContext(ctx context.Context) *slog.Logger {
l, ok := ctx.Value(loggerKey{}).(*slog.Logger)
if !ok { return slog.Default() }
return l
}Tingkat pencatatan
Gunakan tingkat yang sesuai: Debug untuk detail pengembangan, Info untuk ringkasan permintaan, Warn untuk kejanggalan yang dapat dipulihkan, Error untuk kegagalan yang memerlukan tindakan. Jangan mencatat bidang sensitif (token, kata sandi).
Kelompok latensi
Sertakan latensi permintaan di setiap baris catatan. Agregasikan ke dalam kelompok histogram di sistem metrik Anda (Prometheus) untuk melacak persentil P50/P95/P99.
ID korelasi dalam layanan mikro
Teruskan header X-Request-ID dari permintaan masuk ke semua panggilan HTTP dan gRPC keluar untuk mengaktifkan pelacakan terdistribusi tanpa sistem pelacakan lengkap.
Pengambilan sampel log
Untuk layanan dengan lalu lintas tinggi, ambil sampel log debug/info (misalnya, catat 1 dari setiap 100 permintaan pada tingkat debug) untuk mengurangi biaya penyimpanan sambil tetap mencatat log kesalahan secara lengkap.
zap dibandingkan slog
zap (Uber) lebih cepat daripada slog untuk layanan dengan throughput tinggi, tetapi memerlukan lebih banyak penyiapan. slog merupakan bagian dari pustaka standar, portabel, dan memadai untuk sebagian besar layanan. Pilih slog kecuali hasil tolok ukur menunjukkan adanya hambatan kinerja.
Pemeriksaan Singkat
Mengapa captureWriter diperlukan dalam perangkat tengah pencatatan log?
Ringkasan: Pencatatan Log dan ID Permintaan
Poin-poin penting:
- Buat atau teruskan X-Request-ID dalam perangkat tengah; simpan di konteks
- Gunakan slog untuk log terstruktur dengan bidang kunci-nilai
- captureWriter mencegat kode status untuk pencatatan log setelah penangan selesai
- Teruskan ID korelasi ke semua panggilan layanan hilir
Belajar Go dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Middleware Logging dan ID Permintaan” gratis?
Ya — teks lengkap “Middleware Logging dan ID Permintaan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Middleware Logging dan ID Permintaan”?
Logging terstruktur dan penyisipan ID pelacakan Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Middleware Logging dan ID Permintaan” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Dasar-Dasar Rantai Middleware HTTP
- Middleware Logging dan ID Permintaan
- Middleware Autentikasi dan Pembatasan Laju
- Middleware CORS dan Pemulihan dari Panic