コマンド出力をリアルタイムでコンソールとログ ファイルに同時にリダイレクトする方法
提供されたコードは、コマンドの stdout と stderr を出力します。コンソールにはありますが、リアルタイムでファイルに記録する機能がありません。この記事では、MultiWriter を使用して、次の基準を遵守しながらログ記録とコンソール出力を同時に実現するソリューションを紹介します:
スキャナー、io.Copy、およびその他の技術を使用した以前の試みでは、出力順序を維持できませんでしたゴルーチン間の潜在的な競合状態が原因です。
解決策: MultiWriter の使用
この解決策は、複数の宛先に同時に書き込むことができる io.MultiWriter タイプを利用します。修正されたコードは次のとおりです。
<code class="go">package main import ( "io" "log" "os" "os/exec" ) func main() { // Logging capability f, err := os.OpenFile("log.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatalf("Error opening file: %v", err) } defer f.Close() mwriter := io.MultiWriter(f, os.Stdout) cmd := exec.Command("ls") cmd.Stderr = mwriter cmd.Stdout = mwriter err = cmd.Run() //blocks until sub process is complete if err != nil { panic(err) } }</code>
MultiWriter インスタンス mwriter は、ログ ファイルと標準出力を結合します。コマンドに Stdout と Stderr を指定する場合は、mwriter を使用して、コンソール出力とロギングの両方が同時に行われるようにします。
以上がコマンド出力をリアルタイムでコンソールとログファイルに同時にリダイレクトするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。