Heim  >  Artikel  >  Backend-Entwicklung  >  Wie trennt man Protokolle mit uber-go/zap nach Ebene in Stdout und Stdderr?

Wie trennt man Protokolle mit uber-go/zap nach Ebene in Stdout und Stdderr?

Linda Hamilton
Linda HamiltonOriginal
2024-10-26 08:06:02819Durchsuche

How to Separate Logs by Level to Stdout and Stderr using uber-go/zap?

Protokollierung auf stdout und stderr mit uber-go/zap

Trennung der Protokollierung verschiedener Protokollebenen auf stdout und stderr mit uber-go /zap kann durch die Verwendung eines T-Kerns erreicht werden. Ein T-Kern kombiniert mehrere Kerne und ermöglicht so das Schreiben von Protokollen an verschiedene Ziele basierend auf ihrer Ebene.

So erstellen Sie einen T-Kern

Um einen T-Kern zu erstellen, Sie müssen zwei einzelne Kerne konstruieren: einen für stdout und einen anderen für stderr. Jeder Kern enthält einen Encoder zum Formatieren der Protokollnachrichten und einen Synchronisierer zum Schreiben der Protokolle auf das entsprechende Gerät.

Beispiel für einen T-Kern

Der folgende Ausschnitt zeigt, wie man erstellt Ein Tee-Kern, der Infoprotokolle in stdout und Fehler-/schwerwiegende Protokolle in stderr trennt:

<code class="go">package main

import (
    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
    "os"
)

func main() {
    // Syncers for stdout and stderr
    stdoutSyncer := zapcore.Lock(os.Stdout)
    stderrSyncer := zapcore.Lock(os.Stderr)

    // Create two level enablers
    infoLevel := zap.LevelEnablerFunc(
        func(level zapcore.Level) bool {
            return level == zapcore.InfoLevel
        },
    )

    errorFatalLevel := zap.LevelEnablerFunc(
        func(level zapcore.Level) bool {
            return level == zapcore.ErrorLevel || level == zapcore.FatalLevel
        },
    )

    // Create two cores
    infoCore := zapcore.NewCore(
        zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
        stdoutSyncer,
        infoLevel,
    )

    errorFatalCore := zapcore.NewCore(
        zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
        stderrSyncer,
        errorFatalLevel,
    )

    // Combine the cores into a tee core
    teeCore := zapcore.NewTee(
        infoCore,
        errorFatalCore,
    )

    // Create a logger with the tee core
    logger := zap.New(
        teeCore,
    )

    // Log messages at different levels
    logger.Info("Info log")
    logger.Error("Error log")
}</code>

Ausgabeumleitung

Um die Trennung der Protokollausgabe zu überprüfen, können Sie Folgendes tun Leiten Sie stdout oder stderr nach /dev/null um und beobachten Sie die verbleibende Ausgabe.

<code class="bash">$ go build main.go

$ ./main 2>/dev/null # Shows only stdout
{
    "level": "info",
    "ts": 1626900981.520349,
    "msg": "info log"
}

$ ./main 1>/dev/null # Shows only stderr
{
    "level": "error",
   "ts": 1626901025.056065,
    "msg": "error log"
}</code>

Das obige ist der detaillierte Inhalt vonWie trennt man Protokolle mit uber-go/zap nach Ebene in Stdout und Stdderr?. 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