繼羅恩·伯金的建議,這裏是/tmp/log4perl.conf
log4perl.logger.test_app = INFO, FileAppndr1
log4perl.appender.FileAppndr1 = Log::Log4perl::Appender::File
log4perl.appender.FileAppndr1.filename = /tmp/test_app.log
log4perl.appender.FileAppndr1.layout = Log::Log4perl::Layout::SimpleLayout
test.pl
#!/usr/bin/env perl
use warnings;
use strict;
use IPC::Open3;
use Log::Log4perl;
use Symbol 'gensym'; # Create anonymous glob (filehandle)
Log::Log4perl::init("/tmp/log4perl.conf");
my $logger = Log::Log4perl->get_logger("test_app");
$logger->info('-'x40); # New run
my @tasks = (
[ 'ls', '-lt', '/tmp/test_app.log' ], # ok
[ 'df', '-h' ], # ok
[ 'grep', 'foo', '/var/log/foo' ], # error
);
for my $task (@tasks) {
run_command($task);
}
sub run_command {
my ($command_with_args) = @_;
my ($writer, $reader, $error);
$error = gensym;
my $pid = open3($writer, $reader, $error, @$command_with_args);
waitpid($pid, 0);
my $child_exit_status = $? >> 8;
$logger->info("Running [ " . join(' ', @$command_with_args) . " ]");
{
local $/; # Read all of $reader/$error at one go, but do not affect rest of program
if ($child_exit_status) {
$logger->error("ERROR: Got status code [ $child_exit_status ]");
$logger->error("Error Message:\n" . <$error>);
} else {
$logger->info("SUCCESS");
$logger->info("Output:\n" . <$reader>);
}
}
}
輸出使用IPC::Open3
一個例子 - /tmp/test_app.log
INFO - ----------------------------------------
INFO - Running [ ls -lt /tmp/test_app.log ]
INFO - SUCCESS
INFO - Output:
-rw-rw-r-- 1 felix felix 29129 Oct 24 00:06 /tmp/test_app.log
INFO - Running [ df -h ]
INFO - SUCCESS
INFO - Output:
Filesystem Size Used Avail Use% Mounted on
/dev/xvda2 30G 13G 18G 41%/
devtmpfs 3.6G 0 3.6G 0% /dev
/dev/xvdh 100G 25G 76G 25% /data/home
INFO - Running [ grep foo /var/log/foo ]
ERROR - ERROR: Got status code [ 2 ]
ERROR - Error Message:
grep: /var/log/foo: No such file or directory
您可以使用'2>&1'將stderr重定向到標準輸出。例如:'''$ log ='service someservice restart 2>&1'''' –
我建議走不同的方向。我不會使用反引號,而是使用** IPC :: Open3 **,以便可以在單獨的變量中捕獲stdout和stderr。 stdout被記錄爲info,stderr被記錄爲警告或錯誤。 –
另一個建議是包裝執行並記錄在一個子文件中。創建要執行的項目的哈希值,並將特定的哈希元素(鍵/值)傳遞給子項以執行並記錄結果。 –