1

log4perl を使用してすべての出力を画面とファイルに記録する perl スクリプトがあります。問題は、特定の出力が 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 の代わりに print ステートメントを使用していることはわかっていますが、log4perl の構成を、スクリプトの生成方法に関係なく、スクリプトのすべての出力が log4perl に送信されるようにしたいと考えています。

これを行う方法についてのアイデアはありますか?

4

2 に答える 2

1

sub process_file {}は、メインパッケージの一部としてコンパイルされます。stdoutに印刷するようにこれを指示しただけです。下に別のステートメントを追加して、ログに出力します。したがって、2つのprintステートメントがあります。1つは画面用で、もう1つはログ用です。

IO :: Teeモジュールは、複数のファイルハンドルのファイルハンドルオブジェクトを作成するため、1つに印刷すると、含まれているすべてのハンドルが出力を受け取ります。ただし、ファイルハンドルを開き、それをファイルハンドルに出力するオブジェクトを渡すと、バグが発生する可能性があります。

于 2013-03-04T18:21:48.923 に答える
0

「IPC::Run3」を使用して、log->info/error でキャプチャできなかったコマンド/関数の出力をキャプチャしました。次に、このキャプチャされた出力を log->info/error に出力しました。

明確にするために、私が上でやろうとしていたことは、perl コード内で実行されたコマンドの出力をキャプチャし、その出力をログにリダイレクトすることです。

于 2013-05-16T20:45:54.823 に答える