2
私はバッククォート内のいくつかのコマンドのためにstdoutとstderrを記録する必要があります。バックスティックのいくつかのコマンドのためのstdoutとstderrのログ
my $logger = Log::Log4perl->get_logger("test_app");
...
my $log;
$log = `service someservice restart`;
$logger->info("someservice: $log");
$log = `~/scripts/test.pl param1`;
$logger->info("test.pl: $log");
$log = `~/scripts/script.pl param2`;
$logger->info("script.pl: $log");
$log = `~/scripts/env.pl param3`;
$logger->info("env.pl: $log");
$log = `~/scripts/monitor.pl param4`;
$logger->info("monitor.pl: $log");
この場合、stdoutのみが記録されます。どうすればstderrも記録できますか?
このコードは醜いです。より優雅に書く方法はありますか?ロン・バージンの提案に続き
stderrをstdoutにリダイレクトするには、 '2>&1'を使用できます。例: '' '$ log ='サービスのサービス再開2>&1' '' ' –
別の方向に進むことをお勧めします。 backticksを使う代わりに** IPC :: Open3 **を使ってstdoutとstderrを別々のvarsに取り込むことができます。 stdoutはinfoとして記録され、stderrは警告またはエラーとして記録されます。 –
もう1つの提案は、実行をラップしてサブにロギングすることです。実行される項目のハッシュを作成し、特定のハッシュ要素(キー/値)をサブに渡して実行し、結果を記録します。 –