perl的logwrapper

前端之家收集整理的这篇文章主要介绍了perl的logwrapper前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_0@
@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;  


 完!

@H_301_0@

猜你在找的Perl相关文章