Heim >Backend-Entwicklung >Golang >Wie trennt man mit Uber-Go/Zap Infoprotokolle in STDOUT und Fehler-/schwerwiegende Protokolle in STDERR?

Wie trennt man mit Uber-Go/Zap Infoprotokolle in STDOUT und Fehler-/schwerwiegende Protokolle in STDERR?

DDD
DDDOriginal
2024-10-25 08:52:29327Durchsuche

How to Separate Info Logs to STDOUT and Error/Fatal Logs to STDERR Using Uber-Go/Zap?

Wie protokolliere ich bei STDOUT und STDERR basierend auf der Protokollebene mit Uber-Go/Zap?

Zap, eine beliebte Go-Protokollierungsbibliothek, ermöglicht es Ihnen, basierend auf ihrer Ebene zu steuern, wo Protokollnachrichten geschrieben werden. So konfigurieren Sie Zap zum Schreiben:

  • Infoprotokolle an STDOUT
  • Fehler- und Schwerwiegendeprotokolle an STDERR

ZapCore.NewTee mit separaten Kernen verwenden:

Um diese Trennung zu erreichen, erstellen Sie einen T-Kern, der zwei Kerne kombiniert:

  • Ein Kern ist dediziert zum InfoLevel, Schreiben an STDOUT.
  • Ein weiterer Kern für ErrorLevel und FatalLevel, Schreiben an STDERR.

Hier ist ein Beispielprogramm, das diese Technik demonstriert:

<code class="go">package main

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

func main() {
    // 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
    })

    // Write syncers
    stdoutSyncer := zapcore.Lock(os.Stdout)
    stderrSyncer := zapcore.Lock(os.Stderr)

    // Tee core for InfoLevel and ErrorLevel/FatalLevel separation
    core := zapcore.NewTee(
        zapcore.NewCore(
            zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
            stdoutSyncer,
            infoLevel,
        ),
        zapcore.NewCore(
            zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
            stderrSyncer,
            errorFatalLevel,
        ),
    )

    // Create logger with tee core
    logger := zap.New(core)

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

In diesem Beispiel protokolliert das Programm sowohl eine Info-Nachricht an STDOUT als auch eine Fehlermeldung an STDERR. Sie können dies überprüfen, indem Sie die entsprechenden Ausgaben nach /dev/null:

<code class="bash"># stdout only
$ go build main.go && ./main 2>/dev/null
{
  "level": "info",
  "ts": <timestamp>,
  "msg": "Info log"
}

# stderr only
$ go build main.go && ./main 1>/dev/null
{
  "level": "error",
  "ts": <timestamp>,
  "msg": "Error log"
}</code>
umleiten

Das obige ist der detaillierte Inhalt vonWie trennt man mit Uber-Go/Zap Infoprotokolle in STDOUT und Fehler-/schwerwiegende Protokolle in STDERR?. 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