>  기사  >  백엔드 개발  >  uber-go/zap을 사용하여 로그를 레벨별로 Stdout 및 Stderr로 분리하는 방법은 무엇입니까?

uber-go/zap을 사용하여 로그를 레벨별로 Stdout 및 Stderr로 분리하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-26 08:06:02819검색

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

uber-go/zap을 사용하여 stdout 및 stderr에 로깅

uber-go를 사용하여 다양한 로그 수준의 로깅을 stdout 및 stderr로 분리 /zap은 티 코어를 사용하여 달성할 수 있습니다. 티 코어는 여러 코어를 결합하여 레벨에 따라 다양한 대상에 로그를 기록할 수 있습니다.

티 코어 생성 방법

티 코어를 생성하려면, 두 개의 개별 코어를 구성해야 합니다. 하나는 stdout용이고 다른 하나는 stderr용입니다. 각 코어에는 로그 메시지 형식을 지정하는 인코더와 적절한 장치에 로그를 쓰는 동기화 장치가 포함되어 있습니다.

티 코어 예시

다음 스니펫은 생성 방법을 보여줍니다. 정보 로그를 stdout으로 분리하고 오류/치명적 로그를 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>

출력 리디렉션

로그 출력의 분리를 확인하려면 다음을 수행합니다. 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으로 문의하세요.