Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将perl脚本的所有输出定向到文件和屏幕_Perl_Logging_Stdout_Stderr_Log4perl - Fatal编程技术网

将perl脚本的所有输出定向到文件和屏幕

将perl脚本的所有输出定向到文件和屏幕,perl,logging,stdout,stderr,log4perl,Perl,Logging,Stdout,Stderr,Log4perl,我有一个perl脚本,它使用log4perl将所有输出记录到屏幕和文件中。 问题是,某些输出不会被定向到log4perl 脚本- 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_

我有一个perl脚本,它使用log4perl将所有输出记录到屏幕和文件中。 问题是,某些输出不会被定向到log4perl

脚本-

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配置-

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
我知道我使用的是print语句,而不是log->info,但是我希望log4perl配置能够使脚本的所有输出,不管它是如何生成的,都指向log4perl


关于如何做到这一点,有什么想法吗?

子进程文件{}作为主程序包的一部分进行编译。您只告诉了打印到标准输出。在下面添加另一条语句以打印到日志中。所以您有两个打印语句,一个用于屏幕,一个用于日志


Tee模块为多个filehandles创建一个filehandle对象,因此您可以打印到其中一个,并且包含的所有句柄都将接收输出。但是传入一个打开文件句柄的对象并将其打印到一个同样执行此操作的文件句柄中可能会出现错误。

子进程_file{}作为主包的一部分进行编译。您只告诉了打印到标准输出。在下面添加另一条语句以打印到日志中。所以您有两个打印语句,一个用于屏幕,一个用于日志


Tee模块为多个filehandles创建一个filehandle对象,因此您可以打印到其中一个,并且包含的所有句柄都将接收输出。但是传入一个打开文件句柄的对象并将其打印到一个同样执行此操作的文件句柄中可能会出现错误。

我使用“IPC::Run3”捕获日志->信息/错误无法捕获的任何命令/函数的输出。然后我将捕获的输出打印到log->info/error


为了澄清,我在上面尝试的是捕获在perl代码中执行的命令的输出,并将该输出重定向到日志。

我使用“IPC::Run3”捕获日志->信息/错误无法捕获的任何命令/函数的输出。然后我将捕获的输出打印到log->info/error

为了澄清一下,我在上面试图做的是捕获在perl代码中执行的命令的输出,并将该输出重定向到日志