Benutzerdefinierte Handler
Eigene Logausgaben erstellen
Benutzerdefinierte Handler ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Wenn integrierte Handler nicht ausreichen
Text- und JSON-Handler decken die meisten Anforderungen ab, aber manchmal benötigen Sie eine eigene Ausgabe: farbige Terminals, das Senden an ein Metriksystem oder das Schwärzen von Geheimnissen. Dafür erstellen Sie einen eigenen Handler.
Das Handler-Interface
Ein Handler implementiert vier Methoden:
Enabled(ctx, level) boolHandle(ctx, record) errorWithAttrs(attrs) HandlerWithGroup(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 steuert die Filterung
Enabled wird aufgerufen, bevor ein Datensatz erstellt wird. Wenn die Methode false zurückgibt, kann slog die gesamte Arbeit überspringen. Verwenden Sie sie daher für die Prüfung des Levels.
func (h *MyHandler) Enabled(_ context.Context, l slog.Level) bool {
return l >= slog.LevelInfo
}Handle erledigt die Arbeit
Handle erhält ein slog.Record mit Zeit, Level, Nachricht und Attributen. Sie können es beliebig formatieren und schreiben.
func (h *MyHandler) Handle(_ context.Context, r slog.Record) error {
fmt.Printf("[%s] %s\n", r.Level, r.Message)
return nil
}Attribute durchlaufen
Ein Record stellt seine Attribute über r.Attrs bereit, das Ihre Funktion für jedes Attribut aufruft.
r.Attrs(func(a slog.Attr) bool {
fmt.Printf(" %s=%v\n", a.Key, a.Value)
return true // keep going
})WithAttrs und WithGroup
Diese Methoden geben eine Kopie Ihres Handlers zurück, die voreingestellte Attribute oder ein Gruppenpräfix enthält. Sie unterstützen logger.With und slog.Group. Ein minimaler Handler kann die Attribute speichern und erneut ausgeben oder zu Lernzwecken sich selbst zurückgeben.
Verpacken statt selbst erstellen
Oft benötigen Sie keinen vollständigen Handler. Verpacken Sie stattdessen einen vorhandenen Handler und überschreiben Sie nur das gewünschte Verhalten, etwa um ein konstantes Attribut hinzuzufügen oder Schlüssel zu schwärzen.
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)
}Anwendungsfall: Schwärzen
Ein Handler zum Schwärzen kann Attribute nach sensiblen Schlüsseln wie password oder token durchsuchen und den Wert ersetzen, bevor er an einen JSON-Handler delegiert.
Anwendungsfall: Weiterleitung
Ein eigener Handler kann nach Level weiterleiten: Error-Logs an stderr und einen Alerting-Webhook senden, während Info nach stdout geht. Dadurch bleibt die Weiterleitungslogik aus jedem einzelnen Aufrufort heraus.
Hinweise zur Performance
Handle kann in Hot Paths ausgeführt werden. Vermeiden Sie Allokationen, prüfen Sie das Level in Enabled und verwenden Sie Buffer wieder. Die Standard-Handler verwenden aus diesem Grund intern einen gepoolten Buffer.
Ausführbar: Ein minimaler eigener Handler
Dieses eigenständige Programm definiert einen kleinen Handler, der Level, Nachricht und Attribute ausgibt, und protokolliert anschließend über ihn.
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)
}Schnelltest
Testen Sie Ihr Verständnis eigener Handler.
Zusammenfassung
Sie haben gelernt, eigene Handler zu erstellen:
- Implementieren Sie
Enabled,Handle,WithAttrsundWithGroup - Prüfen Sie das Level aus Performancegründen in
Enabled - Durchlaufen Sie Attribute mit
r.Attrs - Oft ist es einfacher, einen vorhandenen Handler zu verpacken, als einen von Grund auf neu zu erstellen
Häufig gestellte Fragen
Ist die Lektion „Benutzerdefinierte Handler“ kostenlos?
Ja — der vollständige Text von „Benutzerdefinierte Handler“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Benutzerdefinierte Handler“?
Eigene Logausgaben erstellen Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Go Academy zu starten?
Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Benutzerdefinierte Handler“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?
Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Warum strukturierte Logs?
- slog-Handler
- Log-Level und Attribute
- Benutzerdefinierte Handler