Heim  >  Artikel  >  Backend-Entwicklung  >  Wie können Sie die Uber Go Zap-Bibliothek verwenden, um Protokolle verschiedener Ebenen in stdout und stderr zu trennen?

Wie können Sie die Uber Go Zap-Bibliothek verwenden, um Protokolle verschiedener Ebenen in stdout und stderr zu trennen?

Linda Hamilton
Linda HamiltonOriginal
2024-10-25 17:25:17106Durchsuche

How can you use Uber Go Zap library to separate logs of different levels to stdout and stderr?

Verwenden von uber-go/zap zum Protokollieren basierend auf der Protokollebene für stdout und stderr

Einführung

Die uber-go/zap-Bibliothek bietet robuste Protokollierungsfunktionen. Um bestimmte Anforderungen zu erfüllen, kann es von Vorteil sein, Protokolle unterschiedlicher Ebenen an separate Ziele wie stdout und stderr weiterzuleiten. In diesem Artikel wird erläutert, wie Sie diese Trennung erreichen und sicherstellen, dass Protokolle basierend auf ihrem Schweregrad auf die entsprechenden Geräte geschrieben werden.

Benutzerdefinierte Protokollierungskonfiguration

Um benutzerdefiniertes Protokollierungsverhalten in Uber festzulegen -go/zap, wir können die zap.Config-Struktur verwenden. Durch Ändern der Felder OutputPaths und ErrorOutputPaths können wir die Ziele für verschiedene Protokollebenen steuern. Wenn jedoch nur ein Pfad in OutputPaths oder ErrorOutputPaths festgelegt ist, werden alle Protokolle unabhängig von ihrer Ebene an dieses einzelne Ziel geschrieben.

Lösung: Zapcore.NewTee

Um die gewünschte Trennung zu erreichen, verwenden wir zapcore.NewTee, das einen T-Kern erstellt, der mehrere Kerne kombiniert. Jeder Kern kann Protokolle bestimmter Ebenen unabhängig verarbeiten und sie an ihre jeweiligen Ziele weiterleiten. So implementieren wir diese Lösung:

<code class="go">import (
    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
    "os"
)

func main() {
    stdoutSyncer := zapcore.Lock(os.Stdout)
    stderrSyncer := zapcore.Lock(os.Stderr)

    infoCore := zapcore.NewCore(
        zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
        stdoutSyncer,
        zap.InfoLevel,
    )

    errorCore := zapcore.NewCore(
        zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
        stderrSyncer,
        zap.ErrorLevel,
    )

    core := zapcore.NewTee(infoCore, errorCore)
    logger := zap.New(core)

    logger.Info("info log")
    logger.Error("error log")
}</code>

In diesem Beispiel erstellen wir zwei Kerne: einen für Protokolle auf Informationsebene (in stdout geschrieben) und einen anderen für Protokolle auf Fehlerebene (in stderr geschrieben). Die zapcore.NewTee-Funktion kombiniert diese Kerne und ermöglicht so die Weiterleitung von Protokollen unterschiedlicher Ebenen an separate Ziele.

Durch die Umleitung von stdout oder stderr nach /dev/null können wir weiter überprüfen, ob jede Protokollnachricht tatsächlich geschrieben wird das richtige Gerät, je nach Level.

Das obige ist der detaillierte Inhalt vonWie können Sie die Uber Go Zap-Bibliothek verwenden, um Protokolle verschiedener Ebenen in stdout und stderr zu trennen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn