来源:

http://www.cnblogs.com/itech/archive/2012/09/22/2698385.html

对任何的函数将标准输出和错误输出重定向到对应的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(! $ ||$ == "");
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/);
my $mins = int($t%/);
my $secs = int($t%%);
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;

perl的logwrapper的更多相关文章

  1. 精通Perl(第2版)

    精通Perl(第2版)(通往Perl大师之路必读经典书籍,体现了一种编程思维,能够帮你解决很多实际的问题) [美]brian d foy(布瑞恩·D·福瓦)著   王兴宇 刘宸宇 译 ISBN 978 ...

  2. perl

    introduction: http://www.yiibai.com/perl/perl_introduction.html functions: http://www.yiibai.com/per ...

  3. perl学习之路3

    Perl编程之路3 标签: perl 列表与数组   Perl里面代表复数的就是列表和数组 列表(list)指的是标量的有序集合, 而数组(array)则是存储列表的变量. 在Perl这两个属于尝尝混 ...

  4. perl学习之路2

    这些主要是从 "小骆驼" 书上粘贴或者摘抄出来的, 个人认为需要记的语法知识 "在某些情况下, 你可能需要在一台机器上写程序, 再传送到另一台机器上运行.这时候, 请使用 ...

  5. perl学习之路1

    一切要从Hollo world开始 公司要用perl....啊, 不会只能自学了, 毕竟是公司啊, 不是学校...公司不学习就滚蛋了...惨惨惨 因为是学习嘛, 感觉开虚拟机比较麻烦所以直接用了个 瘟 ...

  6. perl 切换 dnspod 域名记录

    提供域名,dnspod 账户密码(毕竟dns密码比较重要 不能谁 cat一下都可以看到 需要base64加密),原IP,切换目标IP, #!/bin/perl use warnings; use MI ...

  7. perl 删除过期文件

    #!/usr/bin/perl `find /bak/ >list.txt`; open LIST,"/root/list.txt"; while (<LIST> ...

  8. 通过远程 http API 来控制 lnmp 环境的重启perl脚本

    #!/usr/bin/perl use DBD::mysql; use strict; use warnings; use DBI; use utf8; binmode(STDOUT, ':encod ...

  9. 使用Python和Perl绘制北京跑步地图

    当你在一个城市,穿越大街小巷,跑步跑了几千公里之后,一个显而易见的想法是,如果能把在这个城市的所有路线全部画出来,会是怎样的景象呢? 文章代码比较多,为了不吊人胃口,先看看最终效果,上到北七家,下到南 ...

随机推荐

  1. MySQL命令出现字符错误提示原因

    ERROR 2019 (HY000): Can't initialize character set gb2312 搞了好半天,MySQL都重装了两次,号悲剧... 之前设置了系统编码全都是UTF-8 ...

  2. 第一百零三节,JavaScript对象和数组

    JavaScript对象和数组 学习要点: 1.Object类型 2.Array类型 3.对象中的方法 什么是对象,其实就是一种类型,即引用类型.而对象的值就是引用类型的实例.在ECMAScript中 ...

  3. 14.hibernate的反向生成实现全套增删改查

    图片顺序就是步骤顺序 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.

  4. JVM基础02-class文件

    一.class文件结构 介绍之前,请下载一个Bytecode工具,例如byte code viewer或者Java Bytecode Editor,我用的是后者Java Bytecode Editor ...

  5. EnumPrinters用法

    看API描述,不怎么理解,还是在网上找到用法,记载一下: 1: DWORD dwNeeded = 0, dwNum = 0; 2: EnumPrinters(PRINTER_ENUM_LOCAL, N ...

  6. UITextField的属性设置

    1.背景颜色 field.backgoundColor = [UIColor redColor]; 2.设置field文字 field.text = @"输入文字"; 3.设置fi ...

  7. C# 调用C++ DLL 的类型转换

    //C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试 //c++:HANDLE(void *) ---- c#:System.IntPtr //c++:Byt ...

  8. tableIView 区头的一点问题

    要记得设置区头的高度 否则会出现第一行没区头问题

  9. 正则表达式:reg.test is not a function

    正则中 比如 var reg = "/^[0-9]$/" 会报 reg.test is not a function 如果 var reg = /^[0-9]$/ 就不会有错 因为 ...

  10. mac中eclipse安装openExplore插件

    插件地址:https://github.com/samsonw/OpenExplorer/downloads 将下载的jar包放入下面地址:应用程序->eclipse.app,右击->打开 ...