log.New în Go

Creează un jurnal separat (*log.Logger), cu propria destinație, prefix și opțiuni.

Sintaxă
func New(out io.Writer, prefix string, flag int) *Logger

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.New nou 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).