Ce face log.New
Funcțiile log.Println, log.Printf etc. folosesc un jurnal global. log.New creează unul nou, independent, cu aceleași metode: Println, Printf, Fatal, Panic, SetPrefix, SetFlags, SetOutput.
Folosești jurnale separate pentru părți diferite ale aplicației (acces HTTP, erori, baza de date) sau ca să trimiți o componentă să scrie într-un loc anume. Un *log.Logger poate fi folosit în siguranță din mai multe goroutine.
Parametri
| Parametru | Descriere |
|---|---|
out |
Destinația (os.Stdout, un fișier, un buffer). |
prefix |
Textul pus la începutul fiecărui rând. |
flag |
Opțiunile de antet, ca la log.SetFlags. |
Ce returnează
Un *log.Logger nou.
Exemple
Exemplul 1: Două jurnale cu prefixe diferite
package main
import (
"log"
"os"
)
func main() {
info := log.New(os.Stdout, "INFO ", 0)
eroare := log.New(os.Stdout, "EROARE ", log.Lshortfile)
info.Println("plata pentru comanda 1042 primită")
eroare.Printf("stoc insuficient pentru produsul %q", "cafea")
info.Println("comanda 1043 expediată")
}
Rezultat
INFO plata pentru comanda 1042 primită
EROARE main.go:13: stoc insuficient pentru produsul "cafea"
INFO comanda 1043 expediată
Exemplul 2: O componentă cu propriul jurnal
package main
import (
"log"
"os"
)
type Depozit struct {
jurnal *log.Logger
stoc map[string]int
}
func NouDepozit(jurnal *log.Logger) *Depozit {
return &Depozit{jurnal: jurnal, stoc: map[string]int{"mere": 10}}
}
func (d *Depozit) Scoate(produs string, n int) {
if d.stoc[produs] < n {
d.jurnal.Printf("nu pot scoate %d %s, am doar %d", n, produs, d.stoc[produs])
return
}
d.stoc[produs] -= n
d.jurnal.Printf("am scos %d %s, rămân %d", n, produs, d.stoc[produs])
}
func main() {
d := NouDepozit(log.New(os.Stdout, "[depozit] ", 0))
d.Scoate("mere", 4)
d.Scoate("mere", 9)
}
Rezultat
[depozit] am scos 4 mere, rămân 6
[depozit] nu pot scoate 9 mere, am doar 6
Greșeli frecvente
- Creezi un
log.Newnou la fiecare apel de funcție. Creează-l o dată și transmite-l mai departe. - Pentru aplicații noi cu multe jurnale, gândește-te la
log/slog, care adaugă niveluri (info, avertisment, eroare) și câmpuri structurate.
Comenzi înrudite
log.SetOutput: Schimbă locul în care scrie jurnalul implicit: alt fișier, ieșirea standard, un buffer sau mai multe deodată.log.SetPrefix: Setează un text pus la începutul fiecărui rând din jurnalul implicit, de exemplu numele aplicației.log.SetFlags: Alege ce informații se pun la începutul fiecărui rând din jurnal: data, ora, microsecundele, fișierul și linia.slog.New: Creează un *slog.Logger care trimite mesajele unui handler (text, JSON sau propriu).