2016-09-29 9 views
0

stderrをファイルに、そしてstdoutにリダイレクトしたいと思います。
err := syscall.Dup2(int(fatal_logfile.Fd()), int(os.Stderr.Fd())) goder stderrをファイルに転送して標準出力に戻す

をしかし、私はstdoutに、この別の時間をリダイレクトすることができますどのように表示されていない。

私はdup2を使用してファイルにstderrをリダイレクト方法を知っています。 1つのストリームソースを2つの異なるストリームに「コピー」すること。

たとえば、panicが発生したときに、stderrをリダイレクトするときにこのアプリケーションが起動され、使用されたときにこの機能が呼び出されます。この場合、recoverを使用することはできません(多くのgoroutinesを実行しているためです)。

誰でもこれを解決する方法がありますか?


別の実用的なソリューションは、バイナリを呼び出すときpipesteeを使用することですが、アプリ内で定義された同じ動作/ロジックを持つことが可能でしょうか?私はデフォルトでこの方法で実行したいと思います。それはwriterに書かれているものは何でも

./app_bin 2> >(tee -a fatal.log)

+0

私はアプリケーションの外でこれを処理し、必要に応じてstderrをリダイレクトするほうが良いかもしれないと思います。おそらくパイプとコピーでこれを行うことができますが、バッファリングされていないストリームを1つだけ持つのではなく、stderrの出力を失う可能性があります。 – JimB

+0

正しい@JimB - バイナリの実行時に 'stderr'をリダイレクトするという解決策を含め、私の質問を更新しました。おそらく純粋な質問ですが、アプリで同じロジックを「インポート」できますか?私はそれがデフォルトでこの方法で実行されることを望みます – damoiser

+0

あなたのプログラムの外でこれを行うことは常により信頼できるでしょう。クラッシュの場合に出力をキャプチャすることが目標である場合、プロセス内の 'tee'を実行する関数が、プロセスが終了する前にデータを取得しない可能性があります。 – JimB

答えて

-1
writer := io.MultiWriter(os.Stdout, os.Stderr) 

os.Stdoutos.Stderrに書き込みます。

+0

なぜ否定的なのですか?それは実行可能な解決策のようですか? – reticentroot

+0

質問は、stderrの書き込みがリダイレクトされ、os.Fileとos.Stdoutに複製されるように要求しています。これにより、os.Stdoutとos.Stderrへの出力を行うが、os.Stderrはまったくリダイレ​​クトしない独立したio.Writerが作成されます。 – JimB

+0

解決策cd1に感謝しますが、@ JimBには正しいことがあります。 – damoiser

関連する問題