perl的logwrapper


对任何的函数将标准输出和错误输出重定向到对应的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;  


 完!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值