Ce face slog.Duration
slog.Duration este forma tipizată pentru durate: timpul de răspuns al unei cereri, cât a durat un export, cât a așteptat o operație. Handler-ul text o scrie în forma ușor de citit (350ms, 1m30s), iar handler-ul JSON ca număr întreg de nanosecunde.
Parametri
| Parametru | Descriere |
|---|---|
key |
Numele câmpului. |
v |
Durata. |
Ce returnează
Un slog.Attr.
Exemple
Exemplul 1: Durata unei operații
package main
import (
"log/slog"
"os"
"time"
)
func faraTimp(groups []string, a slog.Attr) slog.Attr {
if a.Key == slog.TimeKey && len(groups) == 0 {
return slog.Attr{} // un atribut gol nu este afișat
}
return a
}
func main() {
opt := &slog.HandlerOptions{ReplaceAttr: faraTimp}
text := slog.New(slog.NewTextHandler(os.Stdout, opt))
json := slog.New(slog.NewJSONHandler(os.Stdout, opt))
durata := 1*time.Minute + 30*time.Second
text.Info("export terminat", slog.Duration("durata", durata))
json.Info("export terminat", slog.Duration("durata", durata))
json.Info("export terminat", slog.Float64("durata_sec", durata.Seconds()))
}
Rezultat
level=INFO msg="export terminat" durata=1m30s
{"level":"INFO","msg":"export terminat","durata":90000000000}
{"level":"INFO","msg":"export terminat","durata_sec":90}
Exemplul 2: Măsurarea timpului de răspuns
Timpul real variază puțin de la o rulare la alta, așa că afișăm durata trunchiată la 100 ms.
package main
import (
"log/slog"
"os"
"time"
)
func faraTimp(groups []string, a slog.Attr) slog.Attr {
if a.Key == slog.TimeKey && len(groups) == 0 {
return slog.Attr{} // un atribut gol nu este afișat
}
return a
}
func main() {
logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ReplaceAttr: faraTimp}))
inceput := time.Now()
time.Sleep(200 * time.Millisecond) // simulăm o cerere lentă
durata := time.Since(inceput).Truncate(100 * time.Millisecond)
logger.Warn("răspuns lent", "cale", "/raport", slog.Duration("durata", durata))
}
Rezultat
level=WARN msg="răspuns lent" cale=/raport durata=200ms
Greșeli frecvente
- Scrii durata ca număr fără unitate (
"durata", 1500). Nu mai știe nimeni dacă sunt milisecunde sau secunde; foloseșteslog.Durationsau pune unitatea în cheie (durata_ms).
Comenzi înrudite
slog.Time: Creează un atribut cu o dată și oră (time.Time), scrisă în format RFC 3339.slog.String: Creează un atribut tipizat (text, întreg, boolean) pentru un mesaj slog, în locul perechii cheie, valoare.flag.Duration: Definește o opțiune de durată (-timeout=30s, -interval=1m30s) și returnează un pointer la time.Duration.