使用uber-go/zap 根據日誌級別記錄到stdout 和stderr
簡介
uber-go/zap 函式庫提供了強大的日誌記錄功能。為了滿足特定要求,將不同等級的日誌導向到不同的目的地(例如 stdout 和 stderr)可能會很有幫助。本文探討如何實現這種分離,確保日誌根據其嚴重性寫入適當的設備。
自訂日誌記錄配置
在 uber 中指定自訂日誌記錄行為-go/zap,我們可以利用 zap.Config 結構。透過修改OutputPaths和ErrorOutputPaths字段,我們可以控制不同日誌等級的目的地。但是,如果在 OutputPaths 或 ErrorOutputPaths 中僅設定一個路徑,則所有日誌都會寫入到該單一目標,無論其等級為何。
解決方案:Zapcore.NewTee
為了實現所需的分離,我們使用 zapcore.NewTee,它創建了一個組合多個核心的 Tee 核心。每個核心可以獨立處理特定層級的日誌,並將其定向到各自的目的地。以下是我們實作此解決方案的方法:
<code class="go">import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" "os" ) func main() { stdoutSyncer := zapcore.Lock(os.Stdout) stderrSyncer := zapcore.Lock(os.Stderr) infoCore := zapcore.NewCore( zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), stdoutSyncer, zap.InfoLevel, ) errorCore := zapcore.NewCore( zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), stderrSyncer, zap.ErrorLevel, ) core := zapcore.NewTee(infoCore, errorCore) logger := zap.New(core) logger.Info("info log") logger.Error("error log") }</code>
在此範例中,我們建立兩個核心:一個用於資訊級日誌(寫入到stdout),另一個用於錯誤層級日誌(寫入到stderr)。 zapcore.NewTee函數結合了這些核心,允許不同層級的日誌被導向到不同的目的地。
透過將stdout或stderr重定向到/dev/null,我們可以進一步驗證每個日誌訊息確實寫入正確的設備,取決於其等級。
以上是如何使用 Uber Go Zap 函式庫將不同等級的日誌分離到 stdout 和 stderr?的詳細內容。更多資訊請關注PHP中文網其他相關文章!