如何使用 Uber-Go/Zap 根據日誌等級記錄到 STDOUT 和 STDERR?
Zap,一個流行的 Go 日誌庫,可讓您根據日誌訊息的層級控制日誌訊息的寫入位置。以下是如何配置Zap 進行寫入:
將ZapCore.NewTee 與單獨的核心結合使用:
要實現這種分離,請建立一個結合兩個核心的Tee 核心:
這是示範此技術的範例程式:
<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中文網其他相關文章!