stderr
をファイルに、そしてstdout
にリダイレクトしたいと思います。
err := syscall.Dup2(int(fatal_logfile.Fd()), int(os.Stderr.Fd()))
goder stderrをファイルに転送して標準出力に戻す
をしかし、私はstdout
に、この別の時間をリダイレクトすることができますどのように表示されていない。
私はdup2
を使用してファイルにstderr
をリダイレクト方法を知っています。 1つのストリームソースを2つの異なるストリームに「コピー」すること。
たとえば、panic
が発生したときに、stderr
をリダイレクトするときにこのアプリケーションが起動され、使用されたときにこの機能が呼び出されます。この場合、recover
を使用することはできません(多くのgoroutinesを実行しているためです)。
誰でもこれを解決する方法がありますか?
別の実用的なソリューションは、バイナリを呼び出すときpipes
とtee
を使用することですが、アプリ内で定義された同じ動作/ロジックを持つことが可能でしょうか?私はデフォルトでこの方法で実行したいと思います。それはwriter
に書かれているものは何でも
./app_bin 2> >(tee -a fatal.log)
私はアプリケーションの外でこれを処理し、必要に応じてstderrをリダイレクトするほうが良いかもしれないと思います。おそらくパイプとコピーでこれを行うことができますが、バッファリングされていないストリームを1つだけ持つのではなく、stderrの出力を失う可能性があります。 – JimB
正しい@JimB - バイナリの実行時に 'stderr'をリダイレクトするという解決策を含め、私の質問を更新しました。おそらく純粋な質問ですが、アプリで同じロジックを「インポート」できますか?私はそれがデフォルトでこの方法で実行されることを望みます – damoiser
あなたのプログラムの外でこれを行うことは常により信頼できるでしょう。クラッシュの場合に出力をキャプチャすることが目標である場合、プロセス内の 'tee'を実行する関数が、プロセスが終了する前にデータを取得しない可能性があります。 – JimB