uber-go/zap を使用してログ レベルに基づいて stdout および stderr にログを出力する方法
重大度レベルに基づいてログを分割するにはuber-go/zap では、zapcore コアの「ティーイング」の概念を利用します。このアプローチでは、それぞれが特定のレベル イネーブラーを持つ 2 つの独立したコアを組み合わせた T コアを活用します。
実装:
レベル イネーブラーの定義:
<code class="go">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 })</code>
書き込みシンクロのセットアップ:
<code class="go">stdoutSyncer := zapcore.Lock(os.Stdout) stderrSyncer := zapcore.Lock(os.Stderr)</code>
T コアの構築:
<code class="go">core := zapcore.NewTee( zapcore.NewCore( zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), stdoutSyncer, infoLevel, ), zapcore.NewCore( zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), stderrSyncer, errorFatalLevel, ), )</code>
ロガーの作成:
<code class="go">logger := zap.New(core)</code>
デモ:
<code class="go">logger.Info("info log") logger.Error("error log")</code>
テスト:
標準出力をリダイレクトまたは、stderr を /dev/null に実行して、情報ログが stdout に出力され、エラー ログが stderr:
$ go build main.go $ ./main 2>/dev/null # displays only stdout logs {"level":"info","ts":1626900981.520349,"msg":"info log"} $ ./main 1>/dev/null # displays only stderr logs {"level":"error","ts":1626901025.056065,"msg":"error log"}に出力されることを確認します。
以上がuber-go/zap を使用してログを重大度ごとに分ける方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。