2013-03-04 117 views
1

我有一个使用log4perl将所有输出记录到屏幕和文件的perl脚本。 问题是,某些输出没有定向到log4perl。将perl脚本的所有输出指向文件和屏幕

脚本 -

use strict; 
use warnings 'FATAL' => 'all'; 
use Log::Log4perl; 
use File::Find; 

my $log_conf = "log4perl.conf"; 
Log::Log4perl::init($log_conf); 
my $logp  = Log::Log4perl->get_logger(); 
my $dirSource = 'C:\box'; 

sub doFileList { 
    $logp->info('doing dir compare'); 
    find({ wanted => \&process_file, no_chdir => 1 }, $dirSource); 
} 

sub process_file { 
    if (-f $_) { 
     print "This is a file: $_\n"; 
    } else { 
     print "This is not file: $_\n"; 
    } 
} 

#main 
$logp->info('start'); 
eval { doFileList(); }; 
if ([email protected]) { 
    $logp->error('error: ', [email protected]); 
} 
$logp->info('stop'); 

Log4perl配置 -

log4perl.rootLogger    = DEBUG, screen, file 

log4perl.appender.screen   = Log::Log4perl::Appender::Screen 
log4perl.appender.screen.stderr = 0 
log4perl.appender.screen.layout = Log::Log4perl::Layout::PatternLayout 
log4perl.appender.screen.layout.ConversionPattern = %d [%M:%L] %p %F{2} - %m%n 

log4perl.appender.file   = Log::Log4perl::Appender::File 
log4perl.appender.file.filename = log/compare.log 
log4perl.appender.file.mode  = append 
log4perl.appender.file.layout = Log::Log4perl::Layout::PatternLayout 
log4perl.appender.file.layout.ConversionPattern = %d [%M:%L] %p %F{2} - %m%n 

这是在屏幕上输出/ IDE -

2013/03/04 11:56:28 [main:::29] INFO DirCompare\DirCompare.pl - start 
2013/03/04 11:56:28 [tools::dircompare::doFileList:16] INFO DirCompare\DirCompare.pl - doing dir compare 
This is not file: C:\box 
This is a file: C:\box\test01.JPG 
This is a file: C:\box\test02.JPG 
2013/03/04 11:56:28 [main:::34] INFO DirCompare\DirCompare.pl - stop 

下面是日志文件的输出 -

2013/03/04 11:56:28 [main:::29] INFO DirCompare\DirCompare.pl - start 
2013/03/04 11:56:28 [tools::dircompare::doFileList:16] INFO DirCompare\DirCompare.pl - doing dir compare 
2013/03/04 11:56:28 [main:::34] INFO DirCompare\DirCompare.pl - stop 

我知道我使用的是打印语句而不是log-> info,但我希望log4perl的配置是这样的,脚本的所有输出,不管它是如何生成的,都直接指向log4perl。

关于我如何做到这一点的任何想法?

回答

0

我使用的“IPC :: RUN3”捕捉的不能由对数被捕获>方式/错误的任何命令/功能输出。然后我将这个捕获的输出打印到log-> info/error。

只是为了澄清,我试图上面做的是捕捉到Perl代码中执行的命令的输出,并重定向输出到日志。

1

sub process_file {}被编译为主包的一部分。你只告诉它打印到标准输出。在下面添加另一个语句以打印到日志。所以你有两个打印语句,一个用于屏幕,另一个用于日志。

的IO ::三通模块创建多个文件句柄文件句柄对象,所以你可以打印到一个和所有的手柄将包含收到的输出。但传入一个打开文件句柄的对象并将其打印到一个文件句柄中,这也可能会产生错误。