perl的logwrapper
前端之家收集整理的这篇文章主要介绍了
perl的logwrapper,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
301_0@
对任何的函数将标准输出和错误输出重定向到对应的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,"
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;
完!