slog.Duration în Go

Creează un atribut cu o durată (time.Duration): în text apare ca 1.5s, în JSON ca număr de nanosecunde.

Sintaxă
func Duration(key string, v time.Duration) Attr

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ște slog.Duration sau 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.