【问题标题】:directing all output of a perl script to file and screen将 perl 脚本的所有输出定向到文件和屏幕
【发布时间】:2013-03-04 17:04:18
【问题描述】:

我有一个 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

我知道我使用的是打印语句而不是 log->info,但我希望 log4perl 配置能够使脚本的所有输出,无论它是如何生成的,都被定向到 log4perl。

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

【问题讨论】:

    标签: perl logging stdout stderr log4perl


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我使用 'IPC::Run3' 来捕获 log->info/error 无法捕获的任何命令/函数的输出。然后我将此捕获的输出打印到 log->info/error.

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-18
        • 2013-04-30
        • 2019-07-14
        相关资源
        最近更新 更多