log.Println în Go

Scrie un mesaj în jurnal, precedat de dată și oră; Println pune spații între valori, Print ca fmt.Print.

Sintaxă
func Println(v ...any)
func Print(v ...any)

Ce face log.Println

Pachetul log este jurnalizarea simplă din Go. log.Println formatează valorile ca fmt.Println (cu spații între ele), adaugă la început data și ora (2025/03/14 10:30:00) și scrie rândul pe os.Stderr. log.Print formatează ca fmt.Print (spații doar între valorile care nu sunt texte).

Ambele adaugă singure un rând nou la final, dacă mesajul nu se termină deja cu \n. Scrierea este sigură din mai multe goroutine deodată: rândurile nu se amestecă.

Pentru că implicit scriu pe stderr cu data curentă, în exemplele de mai jos redirecționăm jurnalul pe os.Stdout cu log.SetOutput și eliminăm data cu log.SetFlags(0), ca rezultatul să fie mereu același.

Parametri

Parametru Descriere
v Valorile de scris, oricâte și de orice tip.

Ce returnează

Nimic.

Exemple

Exemplul 1: Jurnalul implicit, cu dată și oră

package main

import "log"

func main() {
    log.Println("serverul pornește pe portul", 8080)
    log.Print("conectat la baza de date ", "magazin")
}

Rezultat (pe stderr; data și ora sunt cele curente)

2025/03/14 10:30:00 serverul pornește pe portul 8080
2025/03/14 10:30:00 conectat la baza de date magazin

Exemplul 2: Println față de Print

Print nu pune spațiu între două texte, dar pune între numere; Println pune mereu.

package main

import (
    "log"
    "os"
)

func main() {
    log.SetOutput(os.Stdout)
    log.SetFlags(0)

    log.Println("comanda", 1042, "de la", "Ana")
    log.Print("comanda", 1042, "de la", "Ana")
    log.Print(3, 4, 5)
    log.Print("rând cu final propriu\n")
}

Rezultat

comanda 1042 de la Ana
comanda1042de laAna
3 4 5
rând cu final propriu

Exemplul 3: Jurnal pentru o operație lungă

package main

import (
    "log"
    "os"
)

func main() {
    log.SetOutput(os.Stdout)
    log.SetFlags(0)

    comenzi := []string{"1042", "1043", "1044"}
    log.Println("încep procesarea a", len(comenzi), "comenzi")
    for i, c := range comenzi {
        log.Println("procesez comanda", c, "-", i+1, "din", len(comenzi))
    }
    log.Println("gata")
}

Rezultat

încep procesarea a 3 comenzi
procesez comanda 1042 - 1 din 3
procesez comanda 1043 - 2 din 3
procesez comanda 1044 - 3 din 3
gata

Greșeli frecvente

  • Cauți mesajele jurnalului în ieșirea standard (de exemplu cu ./program > iesire.txt) și nu le găsești. log scrie implicit pe stderr; folosește 2> sau 2>&1.
  • Folosești log.Println pentru jurnale pe care le prelucrezi automat (căutări, alerte). Pentru date structurate (cheie=valoare, JSON) folosește log/slog.

Comenzi înrudite

  • log.Printf: Scrie în jurnal un mesaj formatat după un șablon (ca fmt.Printf), precedat de dată și oră.
  • log.SetFlags: Alege ce informații se pun la începutul fiecărui rând din jurnal: data, ora, microsecundele, fișierul și linia.
  • log.SetOutput: Schimbă locul în care scrie jurnalul implicit: alt fișier, ieșirea standard, un buffer sau mai multe deodată.
  • log.Fatal: Scrie mesajul în jurnal și oprește imediat programul cu codul 1 (ca log.Print urmat de os.Exit(1)).
  • slog.Info: Scrie în jurnalul structurat implicit un mesaj de nivel INFO, cu perechi cheie-valoare.