首頁 >後端開發 >Golang >如何使用 uber-go/zap 按等級將日誌分離到 Stdout 和 Stderr?

如何使用 uber-go/zap 按等級將日誌分離到 Stdout 和 Stderr?

Linda Hamilton
Linda Hamilton原創
2024-10-26 08:06:02901瀏覽

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

使用uber-go/zap 記錄到stdout 和stderr

使用uber-go 將不同日誌等級的日誌記錄分開到stdout 和stderr /zap 可以透過使用T 形核心來實現。 Tee 核心結合了多個核心,允許根據等級將日誌寫入不同的目的地。

如何建立 Tee 核心

要建立 Tee 核心,您需要建立兩個單獨的核心:一個用於標準輸出,另一個用於標準錯誤。每個核心都包含一個用於格式化日誌訊息的編碼器和一個用於將日誌寫入適當裝置的同步器。

Tee 核心範例

以下程式碼片段示範如何建立將資訊日誌分離到stdout 並將錯誤/致命日誌分離到stderr 的tee 核心:

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

輸出重定向

要驗證日誌輸出的分離,您可以將stdout 或stderr 重新導向到/dev/null 並觀察剩餘的輸出。

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

以上是如何使用 uber-go/zap 按等級將日誌分離到 Stdout 和 Stderr?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn