Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengasingkan Log Maklumat kepada STDOUT dan Log Ralat/Maut kepada STDERR Menggunakan Uber-Go/Zap?

Bagaimana untuk Mengasingkan Log Maklumat kepada STDOUT dan Log Ralat/Maut kepada STDERR Menggunakan Uber-Go/Zap?

DDD
DDDasal
2024-10-25 08:52:29326semak imbas

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

Bagaimana untuk Log ke STDOUT dan STDERR Berdasarkan Tahap Log menggunakan Uber-Go/Zap?

Zap, perpustakaan pengelogan Go yang popular, membolehkan anda mengawal tempat mesej log ditulis berdasarkan tahapnya. Begini cara untuk mengkonfigurasi Zap untuk menulis:

  • Maklumat log ke STDOUT
  • Ralat dan Log maut ke STDERR

Menggunakan ZapCore.NewTee dengan Teras Berasingan:

Untuk mencapai pemisahan ini, cipta teras tee yang menggabungkan dua teras:

  • Satu teras khusus kepada InfoLevel, menulis kepada STDOUT.
  • Satu lagi teras khusus untuk ErrorLevel dan FatalLevel, menulis kepada STDERR.

Berikut ialah contoh program yang menunjukkan teknik ini:

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

Dalam contoh ini, atur cara merekodkan kedua-dua mesej Maklumat ke STDOUT dan mesej Ralat ke STDERR. Anda boleh mengesahkan ini dengan mengubah hala output masing-masing ke /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>

Atas ialah kandungan terperinci Bagaimana untuk Mengasingkan Log Maklumat kepada STDOUT dan Log Ralat/Maut kepada 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