Go Academy · Pelajaran

Middleware Logging dan ID Permintaan

Logging terstruktur dan penyisipan ID pelacakan

Pelajaran 2 dari 413 langkah

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
Gratis untuk memulai

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

  1. Dasar-Dasar Rantai Middleware HTTP
  2. Middleware Logging dan ID Permintaan
  3. Middleware Autentikasi dan Pembatasan Laju
  4. Middleware CORS dan Pemulihan dari Panic
← Kembali ke Go Academy