基本的に、STDERR / STDOUTを再度開いて、ストリームとタイムスタンプの両方がすべての行に含まれる1つのログファイルに書き込むようにします。だからprint STDERR "Hello World"
印刷しSTDERR: 20130215123456: Hello World
ます。すべてのprintステートメントを関数呼び出しに書き直したくありません。また、出力の一部は、system()
書き直せない呼び出しを介して外部プロセスから送信されます。
また、出力をファイル「ライブ」に配置する必要があります。つまり、プロセスが完了したときに書き込まれるだけではありません。
(psタイムスタンプを生成する方法の詳細については特に質問していません。ファイルにリダイレクトして文字列を付加する方法だけを尋ねています)
私は次のコードを作成しましたが、面倒です。
my $mode = ">>";
my $file = "outerr.txt";
open(STDOUT, "|-", qq(perl -e 'open(FILE, "$mode", "$file"); while (<>) { print FILE "STDOUT: \$\_"; }'));
open(STDERR, "|-", qq(perl -e 'open(FILE, "$mode", "$file"); while (<>) { print FILE "STDERR: \$\_"; }'));
(上記は日付を追加しませんが、追加するのは簡単です)
よりクリーンなソリューション、perlコードを引用してコマンドラインに渡す必要のないソリューション、または少なくとも複雑さの一部を隠すモジュールを探しています。Capture :: Tinyのコードを見ると、出力の一部の書き込みを処理できるようには見えませんが、それについてはよくわかりません。annotate-output
悲しいことに、外部コマンドでのみ機能します。外部コマンドと通常のPerl印刷の両方で機能するには、これが必要です。