在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
对任何的函数将标准输出和错误输出重定向到对应的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"); 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; 完! |
请发表评论