首页 >后端开发 >Golang >如何使用 Uber-Go/Zap 将信息日志分离到 STDOUT 并将错误/致命日志分离到 STDERR?

如何使用 Uber-Go/Zap 将信息日志分离到 STDOUT 并将错误/致命日志分离到 STDERR?

DDD
DDD原创
2024-10-25 08:52:29332浏览

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

如何使用 Uber-Go/Zap 根据日志级别记录到 STDOUT 和 STDERR?

Zap,一个流行的 Go 日志库,允许您根据日志消息的级别控制日志消息的写入位置。以下是如何配置 Zap 进行写入:

  • 信息日志记录到 STDOUT
  • 错误和致命日志记录到 STDERR

将 ZapCore.NewTee 与单独的核心结合使用:

要实现这种分离,请创建一个结合两个核心的 Tee 核心:

  • 一个专用核心到 InfoLevel,写入 STDOUT。
  • 另一个专用于 ErrorLevel 和 FatalLevel 的核心,写入 STDERR。

这是演示此技术的示例程序:

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

在此示例中,程序将信息消息记录到 STDOUT,将错误消息记录到 STDERR。您可以通过将相应的输出重定向到 /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>

以上是如何使用 Uber-Go/Zap 将信息日志分离到 STDOUT 并将错误/致命日志分离到 STDERR?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn