Dziennik włókien

Możemy wykorzystać dzienniki do obserwowania zachowania programu, diagnostyki problemów lub konfiguracji odpowiednich alertów. Definiowanie dobrze zorganizowanego dziennika może poprawić wydajność wyszukiwania i ułatwić rozwiązywanie problemów.

Fiber zapewnia domyślny sposób drukowania dzienników do standardowego wyjścia. Zapewnia również kilka funkcji globalnych, takich jak log.Info, log.Errorf i log.Warnw.

Poziomy dziennika

const (
    LevelTrace Level = iota
    LevelDebug
    LevelInfo
    LevelWarn
    LevelError
    LevelFatal
    LevelPanic
)

Dostosowany dziennik

Fiber zapewnia interfejs AllLogger, aby dostosować się do różnych bibliotek do logowania.

type CommonLogger interface {
    Logger
    FormatLogger
    WithLogger
}

type AllLogger interface {
    CommonLogger
    ControlLogger
    WithLogger
}

Drukowanie dzienników

Uwaga: Wywołanie metod na poziomie Fatal przerwie wykonanie programu po wydrukowaniu dziennika. Proszę używać ostrożnie. Bezpośrednie drukowanie dzienników na różnych poziomach zostanie wprowadzone do messageKey i domyślnie ustawione na msg.

log.Info("Cześć, Świecie!")
log.Debug("Czy wszystko w porządku?")
log.Info("42 to odpowiedź na pytanie o życie, wszechświat i całą resztę")
log.Warn("Jesteśmy atakowani!")
log.Error("Houston, mamy problem.")
log.Fatal("Do zobaczenia, i dzięki za wszystkie ryby.")
log.Panic("System jest wyłączony.")

Formatowanie i drukowanie dzienników na różnych poziomach, wszystkie metody kończą się na f.

log.Debugf("Cześć %s", "chłopcze")
log.Infof("%d to odpowiedź na pytanie o życie, wszechświat i całą resztę", 233)
log.Warnf("Jesteśmy atakowani %s!", "szefie")
log.Errorf("%s, mamy problem.", "Mistrzu Shifu")
log.Fatalf("Do zobaczenia, i dzięki za wszystkie %s.", "banany")

Drukowanie wiadomości z kluczami i wartościami. Jeśli klucze i wartości nie są sparowane, zostanie wydrukowane KEYVALS UNPAIRED.

log.Debugw("", "Cześć", "chłopcze")
log.Infow("", "numer", 233)
log.Warnw("", "praca", "szef")
log.Errorw("", "imię", "Mistrz Shifu")
log.Fatalw("", "owoc", "banan")

Globalny dziennik

Jeśli chcesz używać tylko prostych funkcji dziennika w projekcie i drukować go globalnie w dowolnym momencie, udostępniamy globalny dziennik.

import "github.com/gofiber/fiber/v2/log"

log.Info("info")
log.Warn("ostrzeżenie")

Powyższy kod wykorzystuje domyślny log.DefaultLogger do standardowego wyjścia. Można również znaleźć już zaimplementowane adaptery w folderze contrib, lub użyć własnego zaimplementowanego Logger i ustawić globalny dziennik za pomocą log.SetLogger.

import (
    "log"
    fiberlog "github.com/gofiber/fiber/v2/log"
)

var _ log.AllLogger = (*customLogger)(nil)

type customLogger struct {
    stdlog *log.Logger
}

// ...
// Wstrzyknięcie niestandardowego dziennika
fiberlog.SetLogger(customLogger)

Ustawianie Poziomu

log.SetLevel ustawia poziomy dzienników niższe od tego poziomu i nie będą wyświetlane. Domyślny rejestrator dziennika to LevelTrace.

Proszę zauważyć, że ta metoda nie jest bezpieczna przy wielowątkowości.

import "github.com/gofiber/fiber/v2/log"

log.SetLevel(log.LevelInfo)

Ustawianie Wyjścia

log.SetOutput ustawia miejsce docelowe wyjścia dla logowania. Domyślnie dziennik drukuje logi do konsoli.

var logger AllLogger = &defaultLogger{
    stdlog: log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile|log.Lmicroseconds),
    depth:  4,
}

Ustaw miejsce docelowe wyjścia na plik.

// Wyjście do pliku test.log
f, err := os.OpenFile("test.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
    return
}
log.SetOutput(f)

Ustaw miejsce docelowe wyjścia zarówno dla konsoli, jak i pliku.

// Wyjście do pliku test.log
file, _ := os.OpenFile("test.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
iw := io.MultiWriter(os.Stdout, file)
log.SetOutput(iw)

Powiąż Kontekst

Ustaw kontekst i użyj następującej metody, aby zwrócić instancję CommonLogger powiązaną z określonym kontekstem.

commonLogger := log.WithContext(ctx)
commonLogger.Info("info")

Uwaga: Jest to domyślna biblioteka logowania dla platformy Fiber. Oczywiście możesz wybrać inne znane biblioteki logowania open-source w języku Go.