对任何的函数将标准输出和错误输出重定向到对应的log文件。
对任何的函数记录函数运行的时间。
代码:
#
!/usr/bin/perl
use warnings;
use strict;
no strict " refs ";
sub testLogToStd{
print " Test stdout : \n ";
open LOG, " > 2.txt ";
select LOG;
print " just a test\n ";
# recover STDOUT
select STDOUT;
print " just a test2\n ";
close LOG;
}
sub testFun{
print " From testFun\n ";
print STDERR " From TestFun Error\n ";
}
sub testFun2{
my $arg1 = shift;
my $arg2 = shift;
print " From testFun2\n ";
print $arg1. " \n ";
print $arg2. " \n ";
}
my $log_root = " log " if(! $ 3 ||$ 3 == "");
my $ret = system( " mkdir $log_root ") if(! -e $log_root);
my $report_log = " $log_root/report.log ";
open my $REPORTLOG, " > ", $report_log or die " cannot not open log file report.log\n ";
sub logWrapper{
my $log_root = shift;
my $REPORTLOG = shift;
my $fun = shift;
my @parameters = @_;
*old_stdout = *STDOUT;
*old_stderr = *STDERR;
open LOG, " > ", " $log_root/$fun.log " or die " annot open log file $fun.\n ";
*STDOUT = * LOG;
*STDERR = * LOG;
my $start = time;
my $ret = & $fun( @parameters);
my $end = time;
*STDOUT = *old_stdout;
*STDERR = *old_stderr;
close LOG;
my $duration = $end - $start;
print $REPORTLOG " $fun\n ";
print $REPORTLOG " start: ". localtime( $start). " \n ";
print $REPORTLOG " end: ". localtime( $end). " \n ";
print $REPORTLOG " duration: ".formatTimeDuration( $duration). " \n ";
print $REPORTLOG " result:$ret\n ";
print $REPORTLOG " \n ";
print $REPORTLOG " \n ";
}
sub formatTimeDuration($){
my $t = shift;
my $hrs = int( $t/ 3600);
my $mins = int( $t% 3600/ 60);
my $secs = int( $t% 3600% 60);
return " $hrs:$mins:$secs ";
}
&logWrapper( $log_root, $REPORTLOG, " testFun ");
&logWrapper( $log_root, $REPORTLOG, " testFun2 ", " arg1 ", " arg2 ");
use warnings;
use strict;
no strict " refs ";
sub testLogToStd{
print " Test stdout : \n ";
open LOG, " > 2.txt ";
select LOG;
print " just a test\n ";
# recover STDOUT
select STDOUT;
print " just a test2\n ";
close LOG;
}
sub testFun{
print " From testFun\n ";
print STDERR " From TestFun Error\n ";
}
sub testFun2{
my $arg1 = shift;
my $arg2 = shift;
print " From testFun2\n ";
print $arg1. " \n ";
print $arg2. " \n ";
}
my $log_root = " log " if(! $ 3 ||$ 3 == "");
my $ret = system( " mkdir $log_root ") if(! -e $log_root);
my $report_log = " $log_root/report.log ";
open my $REPORTLOG, " > ", $report_log or die " cannot not open log file report.log\n ";
sub logWrapper{
my $log_root = shift;
my $REPORTLOG = shift;
my $fun = shift;
my @parameters = @_;
*old_stdout = *STDOUT;
*old_stderr = *STDERR;
open LOG, " > ", " $log_root/$fun.log " or die " annot open log file $fun.\n ";
*STDOUT = * LOG;
*STDERR = * LOG;
my $start = time;
my $ret = & $fun( @parameters);
my $end = time;
*STDOUT = *old_stdout;
*STDERR = *old_stderr;
close LOG;
my $duration = $end - $start;
print $REPORTLOG " $fun\n ";
print $REPORTLOG " start: ". localtime( $start). " \n ";
print $REPORTLOG " end: ". localtime( $end). " \n ";
print $REPORTLOG " duration: ".formatTimeDuration( $duration). " \n ";
print $REPORTLOG " result:$ret\n ";
print $REPORTLOG " \n ";
print $REPORTLOG " \n ";
}
sub formatTimeDuration($){
my $t = shift;
my $hrs = int( $t/ 3600);
my $mins = int( $t% 3600/ 60);
my $secs = int( $t% 3600% 60);
return " $hrs:$mins:$secs ";
}
&logWrapper( $log_root, $REPORTLOG, " testFun ");
&logWrapper( $log_root, $REPORTLOG, " testFun2 ", " arg1 ", " arg2 ");
print "thanks\n";
如果需要调用外部命令需要如下:
use strict;
use warnings;
# run external commands
# redirect stdout and stderr
sub run_cmd{
my $cmd = shift;
my $pid = open(PH, " $cmd 2>&1 | ");
while (<PH>) { print $_; }
}
open(FH, " > ", " perl-test.log ");
*old_stdout = *STDOUT;
*old_stderr = *STDERR;
*STDOUT = *FH;
*STDERR = *FH;
my $ret = undef;
$ret = readpipe( " cp a b ");
$ret = system( " cp a b ");
$ret = `cp a b`;
run_cmd( " cp a b ");
print " AA ";
print STDERR " BB ";
*STDOUT = *old_stdout;
*STDERR = *old_stderr;
use warnings;
# run external commands
# redirect stdout and stderr
sub run_cmd{
my $cmd = shift;
my $pid = open(PH, " $cmd 2>&1 | ");
while (<PH>) { print $_; }
}
open(FH, " > ", " perl-test.log ");
*old_stdout = *STDOUT;
*old_stderr = *STDERR;
*STDOUT = *FH;
*STDERR = *FH;
my $ret = undef;
$ret = readpipe( " cp a b ");
$ret = system( " cp a b ");
$ret = `cp a b`;
run_cmd( " cp a b ");
print " AA ";
print STDERR " BB ";
*STDOUT = *old_stdout;
*STDERR = *old_stderr;
完!