http://www.perlmonks.org?node_id=993808


in reply to How to capture child process output and divert to log4perl

I'm not sure this is what your looking for but Capture::Tiny seems to fit your requirements.

Per ww's post

With "system()", both STDOUT and STDERR will go the same place as the script's STDOUT and STDERR, unless the "system()" command redirects

As a test, save the following as warn.pl

$| = 1;#flush the buffer warn "Starting Program"; print "Hello World\n"; warn "Ending Program";

If you just run warn.pl you get

perl -w warn.pl Starting Program at warn.pl line 2. Hello World Ending Program at warn.pl line 4.

But to do what you want you need to redirect just the STDERR. I offer the following code

use Log::Log4perl qw(:easy); Log::Log4perl->easy_init($ERROR); use Capture::Tiny 0.12 qw( capture_stderr ); my $errors = capture_stderr{ system( 'warn.pl' );# Your favorite system call here }; map{ ERROR $_ } split "\n", $errors;

If you save it as WarnCapture.pl and run that in the same folder as warn.pl you get

perl -w WarnCapture.pl Hello World 2012/09/14 16:34:20 Starting Program at C:\Scripts\warn.pl line 2. 2012/09/14 16:34:20 Ending Program at C:\Scripts\warn.pl line 4.

Capture::Tiny to the rescue!