Maison  >  Article  >  développement back-end  >  Comment séparer les journaux par niveau vers Stdout et Stderr à l'aide d'uber-go/zap ?

Comment séparer les journaux par niveau vers Stdout et Stderr à l'aide d'uber-go/zap ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-26 08:06:02819parcourir

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

Connexion sur stdout et stderr à l'aide d'uber-go/zap

Séparation de la journalisation des différents niveaux de journalisation sur stdout et stderr à l'aide d'uber-go /zap peut être réalisé en utilisant un noyau en T. Un noyau de tee combine plusieurs noyaux, permettant d'écrire des journaux vers différentes destinations en fonction de leur niveau.

Comment créer un noyau de tee

Pour créer un noyau de tee, vous devez construire deux cœurs individuels : un pour stdout et un autre pour stderr. Chaque noyau comprend un encodeur pour formater les messages de journal et un synchroniseur pour écrire les journaux sur l'appareil approprié.

Exemple de noyau de tee

L'extrait suivant montre comment créer un noyau en t qui sépare les journaux d'informations vers stdout et les journaux d'erreurs/fatales vers stderr :

<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>

Redirection de sortie

Pour vérifier la séparation de la sortie des journaux, vous pouvez redirigez stdout ou stderr vers /dev/null et observez la sortie restante.

<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>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn