我有一个perl脚本,它使用log4perl将所有输出记录到屏幕和文件中。问题是,某些输出没有被定向到log4perl。
Script -
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 ($@) {
$logp->error( 'error: ', $@ );
}
$logp->info('stop');
Log4perl config -
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 DirCompareDirCompare.pl - start
2013/03/04 11:56:28 [tools::dircompare::doFileList:16] INFO DirCompareDirCompare.pl - doing dir compare
This is not file: C:box
This is a file: C:boxtest01.JPG
This is a file: C:boxtest02.JPG
2013/03/04 11:56:28 [main:::34] INFO DirCompareDirCompare.pl - stop
这是日志文件中的输出-
2013/03/04 11:56:28 [main:::29] INFO DirCompareDirCompare.pl - start
2013/03/04 11:56:28 [tools::dircompare::doFileList:16] INFO DirCompareDirCompare.pl - doing dir compare
2013/03/04 11:56:28 [main:::34] INFO DirCompareDirCompare.pl - stop
我知道我正在使用打印语句而不是log->info,但我希望log4perl配置能够使脚本的所有输出,无论它是如何生成的,都指向log4perl。
我该怎么做呢?
subprocess_file{}被编译为主包的一部分。您只告诉它打印到标准输出。在下面添加另一条语句以打印到日志中。因此,您有两个打印语句,一个用于屏幕,一个用于日志。
IO::Tee模块为多个文件句柄创建一个文件句柄对象,因此您可以打印到其中一个,并且包含的所有句柄都将接收输出。但是,传入一个对象来打开一个文件句柄并将其打印到一个同样执行此操作的文件句柄中可能会出现问题。
我使用'IPC::Run3'来捕获log->info/error无法捕获的任何命令/函数的输出。然后,我将捕获的输出打印到log->info/error。
只是为了澄清,我上面试图做的是捕获在perl代码中执行的命令的输出,并将该输出重定向到log.