0Pricing
Go Academy · Pelajaran

Handler Kustom

Bangun output log Anda sendiri

Handler Kustom adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Saat Penangan Bawaan Tidak Cukup

Penangan teks dan JSON memenuhi sebagian besar kebutuhan, tetapi terkadang Anda menginginkan keluaran khusus: terminal berwarna, pengiriman ke sistem metrik, atau penyamaran rahasia. Anda dapat membuat Handler khusus.

Antarmuka Handler

Sebuah penangan mengimplementasikan empat metode:

  • Enabled(ctx, level) bool
  • Handle(ctx, record) error
  • WithAttrs(attrs) Handler
  • WithGroup(name) Handler
type Handler interface {
    Enabled(context.Context, slog.Level) bool
    Handle(context.Context, slog.Record) error
    WithAttrs(attrs []slog.Attr) slog.Handler
    WithGroup(name string) slog.Handler
}

Enabled Mengendalikan Penyaringan

Enabled dipanggil sebelum rekaman dibuat. Mengembalikan false memungkinkan slog melewati seluruh pekerjaan tersebut, jadi gunakan fungsi ini untuk pemeriksaan level.

func (h *MyHandler) Enabled(_ context.Context, l slog.Level) bool {
    return l >= slog.LevelInfo
}

Handle Melakukan Pekerjaan

Handle menerima slog.Record yang berisi waktu, level, pesan, dan atribut. Anda dapat memformat dan menulisnya sesuka Anda.

func (h *MyHandler) Handle(_ context.Context, r slog.Record) error {
    fmt.Printf("[%s] %s\n", r.Level, r.Message)
    return nil
}

Mengiterasi Atribut

Sebuah Record menyediakan atributnya melalui r.Attrs, yang memanggil fungsi Anda untuk setiap atribut.

r.Attrs(func(a slog.Attr) bool {
    fmt.Printf("  %s=%v\n", a.Key, a.Value)
    return true // keep going
})

WithAttrs dan WithGroup

Keduanya mengembalikan salinan penangan Anda yang membawa atribut bawaan atau awalan kelompok. Keduanya mendukung logger.With dan slog.Group. Penangan minimal dapat menyimpan dan memutarnya kembali, atau, untuk pembelajaran, mengembalikan dirinya sendiri.

Membungkus, Bukan Membangun

Sering kali Anda tidak memerlukan penangan lengkap; bungkus penangan yang sudah ada dan timpa hanya perilaku tertentu, seperti menambahkan atribut konstan atau menyamarkan kunci.

type RedactHandler struct{ slog.Handler }

func (h RedactHandler) Handle(ctx context.Context, r slog.Record) error {
    // mutate r here, then delegate
    return h.Handler.Handle(ctx, r)
}

Kasus Penggunaan: Penyamaran

Penangan penyamaran dapat memindai atribut untuk mencari kunci sensitif seperti password atau token, lalu mengganti nilainya sebelum meneruskannya ke penangan JSON.

Kasus Penggunaan: Perutean

Penangan khusus dapat merutekan berdasarkan level: mengirim log Error ke stderr dan webhook peringatan, sementara Info dikirim ke stdout. Dengan begitu, logika perutean tidak perlu ditempatkan di setiap lokasi pemanggilan.

Catatan Performa

Handle dapat berjalan di jalur yang sering dijalankan. Hindari alokasi, lakukan pemeriksaan level di Enabled, dan gunakan kembali penyangga. Penangan standar menggunakan penyangga dari kumpulan secara internal untuk alasan ini.

Dapat Dijalankan: Handler Khusus Minimal

Program mandiri ini mendefinisikan penangan kecil yang mencetak level, pesan, dan atribut, lalu mencatat melalui penangan tersebut.

package main

import (
    "context"
    "fmt"
    "log/slog"
)

type Mini struct{}

func (Mini) Enabled(context.Context, slog.Level) bool { return true }
func (Mini) WithAttrs(a []slog.Attr) slog.Handler   { return Mini{} }
func (Mini) WithGroup(string) slog.Handler          { return Mini{} }
func (Mini) Handle(_ context.Context, r slog.Record) error {
    fmt.Printf("%s: %s", r.Level, r.Message)
    r.Attrs(func(a slog.Attr) bool {
        fmt.Printf(" %s=%v", a.Key, a.Value)
        return true
    })
    fmt.Println()
    return nil
}

func main() {
    l := slog.New(Mini{})
    l.Info("hello", "user", "ada", "id", 7)
}

Uji Cepat

Uji pemahaman Anda tentang penangan khusus.

Ringkasan

Anda telah mempelajari cara membuat penangan khusus:

  • Implementasikan Enabled, Handle, WithAttrs, WithGroup
  • Lakukan pemeriksaan level di Enabled demi performa
  • Iterasikan atribut dengan r.Attrs
  • Sering kali lebih mudah membungkus penangan yang sudah ada daripada membangunnya dari awal

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Handler Kustom” gratis?

Ya — teks lengkap “Handler Kustom” 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 “Handler Kustom”?

Bangun output log Anda sendiri 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 4 dari 4.

Berapa lama pelajaran “Handler Kustom” 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. Mengapa Logging Terstruktur
  2. Handler slog
  3. Level Log dan Atribut
  4. Handler Kustom
← Kembali ke Go Academy