log.SetOutput în Go

Schimbă locul în care scrie jurnalul implicit: alt fișier, ieșirea standard, un buffer sau mai multe deodată.

Sintaxă
func SetOutput(w io.Writer)

Ce face log.SetOutput

Implicit, jurnalul scrie pe os.Stderr. log.SetOutput îl redirecționează spre orice io.Writer: un fișier deschis cu O_APPEND, os.Stdout, un bytes.Buffer (util în teste), io.MultiWriter (în mai multe locuri) sau io.Discard (aruncă tot).

Parametri

Parametru Descriere
w Destinația nouă.

Ce returnează

Nimic. log.Writer() returnează destinația curentă.

Exemple

Exemplul 1: Jurnal într-un fișier și pe ecran

package main

import (
    "fmt"
    "io"
    "log"
    "os"
)

func main() {
    f, err := os.OpenFile("aplicatie.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o644)
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    log.SetOutput(io.MultiWriter(os.Stdout, f))
    log.SetFlags(0)
    log.Println("aplicația a pornit")
    log.Println("3 comenzi noi")

    date, _ := os.ReadFile("aplicatie.log")
    fmt.Printf("în fișier: %q\n", date)
}

Rezultat

aplicația a pornit
3 comenzi noi
în fișier: "aplicația a pornit\n3 comenzi noi\n"

Exemplul 2: Capturarea jurnalului într-un buffer

package main

import (
    "bytes"
    "fmt"
    "log"
    "strings"
)

func trimiteEmail(catre string) {
    log.Printf("e-mail trimis către %s", catre)
}

func main() {
    var buf bytes.Buffer
    log.SetOutput(&buf)
    log.SetFlags(0)

    trimiteEmail("mihai@exemplu.ro")
    fmt.Println("jurnalul conține adresa:", strings.Contains(buf.String(), "mihai@exemplu.ro"))
}

Rezultat

jurnalul conține adresa: true

Exemplul 3: Oprirea jurnalului cu io.Discard

package main

import (
    "fmt"
    "io"
    "log"
)

func main() {
    log.SetOutput(io.Discard)
    log.Println("acest mesaj dispare")
    fmt.Println("doar acest rând apare")
}

Rezultat

doar acest rând apare

Greșeli frecvente

  • Deschizi fișierul de jurnal fără O_APPEND (cu os.Create) și pierzi jurnalul vechi la fiecare pornire.

Comenzi înrudite

  • log.New: Creează un jurnal separat (*log.Logger), cu propria destinație, prefix și opțiuni.
  • log.SetFlags: Alege ce informații se pun la începutul fiecărui rând din jurnal: data, ora, microsecundele, fișierul și linia.
  • io.Writer: Interfața pentru orice destinație în care se pot scrie octeți: fișiere, ecran, buffer-e, răspunsuri HTTP.
  • os.File: Tipul care reprezintă un fișier deschis; îl obții cu os.Open, os.Create sau os.OpenFile.