2013-03-04 4 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 대신 print 문을 사용하고 있지만 log4perl 구성은 log4perl로 보내지는 방법에 관계없이 스크립트의 모든 출력이되도록하고 싶습니다.

어떻게 할 수 있습니까?

답변

0

로그 -> 정보/오류로 캡처 할 수없는 명령/기능의 출력을 캡처하기 위해 'IPC :: Run3'을 사용했습니다. 그런 다음 캡처 된 출력을 log-> info/error에 인쇄했습니다.

그냥 명확히하기 위해, 내가 뭘 하려는지 펄 코드 내에서 실행 명령의 출력을 캡처하고 로그 출력을 리디렉션하는 것입니다.

1

sub process_file {}은 주 패키지의 일부로 컴파일됩니다. stdout으로 출력하라는 명령 만했습니다. 로그에 인쇄 할 다른 명령문을 아래에 추가하십시오. 따라서 두 개의 print 문이 있습니다. 하나는 화면 용이고 다른 하나는 로그 용입니다.

IO :: Tee 모듈은 여러 파일 핸들에 대한 파일 핸들 객체를 생성하므로 하나의 파일 핸들로 출력 할 수 있으며 포함 된 모든 핸들이 출력을 수신합니다. 그러나 파일 핸들을 열고 파일 핸들에 파일을 출력하는 객체를 전달하면 버그 핸들을 얻을 수 있습니다.