uber-go/zap を使用してログレベルに基づいて stdout および stderr にログを記録する
概要
uber-go/zap ライブラリは、堅牢なロギング機能を提供します。特定の要件を満たすには、さまざまなレベルのログを stdout や stderr などの別々の宛先に送信すると有益な場合があります。この記事では、この分離を実現し、重大度に基づいて適切なデバイスにログが書き込まれるようにする方法について説明します。
カスタム ログ構成
uber でカスタム ログ動作を指定するには-go/zap では、zap.Config 構造体を利用できます。 OutputPaths フィールドと ErrorOutputPaths フィールドを変更することで、さまざまなログ レベルの宛先を制御できます。ただし、OutputPaths または ErrorOutputPaths にパスが 1 つだけ設定されている場合は、レベルに関係なく、すべてのログがその 1 つの宛先に書き込まれます。
解決策: Zapcore.NewTee
望ましい分離を実現するために、複数のコアを組み合わせた T コアを作成する zapcore.NewTee を採用しています。各コアは、特定のレベルのログを個別に処理し、それぞれの宛先に送信できます。このソリューションの実装方法は次のとおりです。
<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>
この例では、2 つのコアを作成します。1 つは情報レベルのログ (stdout に書き込まれる) 用で、もう 1 つはエラーレベルのログ (stderr に書き込まれる) 用です。 zapcore.NewTee 関数はこれらのコアを結合し、異なるレベルのログを別々の宛先に送信できるようにします。
stdout または stderr を /dev/null にリダイレクトすることで、各ログ メッセージが実際に書き込まれているかどうかをさらに検証できます。レベルに応じて、適切なデバイスを選択します。
以上がUber Go Zap ライブラリを使用して、さまざまなレベルのログを stdout と stderr に分離するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。