Uber-Go/Zap を使用してログ レベルに基づいて STDOUT および STDERR にログを記録する方法?
人気の Go ログ ライブラリである Zap、ログ メッセージをレベルに基づいて書き込む場所を制御できます。
個別のコアで ZapCore.NewTee を使用する:
この分離を実現するには、2 つのコアを組み合わせた T コアを作成します:
この手法を示すサンプル プログラムを次に示します。
<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 中国語 Web サイトの他の関連記事を参照してください。