Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Memisahkan Log mengikut Tahap ke Stdout dan Stderr menggunakan uber-go/zap?

Bagaimana untuk Memisahkan Log mengikut Tahap ke Stdout dan Stderr menggunakan uber-go/zap?

Linda Hamilton
Linda Hamiltonasal
2024-10-26 08:06:02819semak imbas

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

Melog masuk ke stdout dan stderr menggunakan uber-go/zap

Memisahkan pengelogan tahap log yang berbeza kepada stdout dan stderr menggunakan uber-go /zap boleh dicapai dengan menggunakan teras tee. Teras tee menggabungkan berbilang teras, membenarkan log ditulis ke destinasi berbeza berdasarkan tahapnya.

Cara mencipta teras tee

Untuk mencipta teras tee, anda perlu membina dua teras individu: satu untuk stdout dan satu lagi untuk stderr. Setiap teras termasuk pengekod untuk memformatkan mesej log dan penyegerak untuk menulis log ke peranti yang sesuai.

Contoh teras tee

Coretan berikut menunjukkan cara membuat teras tee yang memisahkan log maklumat kepada stdout dan log ralat/maut kepada 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>

Pengalihan semula output

Untuk mengesahkan pemisahan output log, anda boleh ubah hala stdout atau stderr ke /dev/null dan pemerhatian output yang tinggal.

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

Atas ialah kandungan terperinci Bagaimana untuk Memisahkan Log mengikut Tahap ke Stdout dan Stderr menggunakan uber-go/zap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn