2013-04-24 3 views
0

나는 log4perl을 사용하여 모든 것을 파일에 기록하는 펄 스크립트를 가지고있다. log4perl의 구성은 외부 파일에 저장됩니다.mysqldump가 log4perl로 출력

이 스크립트는 qx를 사용하여 mysqldump 명령을 실행합니다. mysqldump 명령의 출력은 화면에 출력되지만 (STDERR로 가정) 로그 파일에는 출력되지 않습니다.

mysqldump (및 화면에 출력되는 다른 모든 stmt)의 출력을 log4perl 로그 파일로 보내고 싶습니다.

qx가 아닌 다른 것을 사용하거나 log4perl config를 변경해야하는지 잘 모르겠습니다.

참고 : 일부 온라인 예제를 보았지만 모두 log4perl easy-config를 사용합니다.

[[email protected] perl]# perl test.pl 
2013/04/24 16:35:33 3 INFO test.pl main::.22 - start backup script 
2013/04/24 16:35:33 4 INFO test.pl create_backup.16 - creating temp mysqldump... 
-- Connecting to localhost... 
-- Disconnecting from localhost... 
2013/04/24 16:35:33 22 INFO test.pl main::.29 - end backup script 

대한 설명 - - 여기

use strict; 
use warnings 'FATAL' => 'all'; 
use Sys::Hostname; 
use Log::Log4perl; 

my $log_conf = "log4perl.conf"; 
Log::Log4perl::init($log_conf); 
my $logp  = Log::Log4perl->get_logger(); 
my $dirTemp  = "temp"; 
my $fileTemp = "temp_backup.gz"; 
my $dbSchema = 'test'; 
my $dbToken01 = 'root'; 
my $dbToken02 = 'haha'; 

sub create_backup { 
    $logp->info("creating temp mysqldump..."); 
    my $backupCmd = "mysqldump -R --triggers -u $dbToken01 -p$dbToken02 -v --quick --single-transaction $dbSchema | gzip > $dirTemp/$fileTemp"; 
    qx($backupCmd); 
} 

#main 
$logp->info("start backup script"); 
eval { 
    create_backup(); 
}; 
if ([email protected]) { 
    $logp->error('error: ', [email protected]); 
} 
$logp->info("end backup script"); 

스크립트의 출력 - 여기
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 %r %p %F{1} %M{1}.%L - %m%n 
log4perl.appender.file   = Log::Log4perl::Appender::File 
log4perl.appender.file.filename = log/mbackup.log 
log4perl.appender.file.mode  = append 
log4perl.appender.file.layout = Log::Log4perl::Layout::PatternLayout 
log4perl.appender.file.layout.ConversionPattern = %d %r %p{5} %F{1} %M{1}.%L - %m%n 

는 펄 스크립트입니다 - 여기

는 log4perl 설정 파일이다 내가 말했을 때 출력 , 나는 mysqldump 명령의 stderr 출력을 의미했다. 화면에 쓰여진 mysqldump 명령어의 모든 텍스트 출력을 log4perl 로그 파일로 보내기를 원한다. 당신이 모두를 수행 할 경우

+0

출력물은 무엇입니까? mysqldump의 모든 출력을'gzip> somefile'으로 파이핑합니다. – chrsblck

+0

명확한 설명을 위해 저의 해결책이 무엇입니까. 모든 출력을 캡처하여 기록합니다. – chrsblck

답변

1

: 당신 만 기록하려면 sub create_backup

sub create_backup { 
    my $sqlDumpFile = "$dirTemp/$fileTemp"; 
    $logp->info("creating temp mysqldump..."); 

    my $backupCmd = "mysqldump -R --triggers -u $dbToken01 -p$dbToken02 -v --quick --single-transaction $dbSchema 2>&1 | tee $sqlDumpFile"; 
    my $dumpOutput = `$backupCmd`; 
    $logp->info($dumpOutput); 
    `gzip $sqlDumpFile`; # note you will have renamed this file to "filename".gz 
} 

업데이트

을 수정하여

:이 같은 뭔가를 할 수 gzipmysqldump 로그인 오류가 발생하면 다음과 같은 작업을 수행 할 수 있습니다.

IPC::Run 여기에서 더 쉽게 생활 할 수 있습니다.

sub create_backup { 
    require IPC::Run qw(run); # or load this at the top of you script... 
    my ($in, $out, $err); 
    my $backupCmd = "mysqldump"; 
    my $sqlDumpFile = "$dirTemp/$fileTemp"; 

    $logp->info("creating temp mysqldump..."); 

    run([$backupCmd, '-R', '--triggers', '-u', $dbToken01, '-p', $dbToken02, 
     '-v', '--quick', '--single-transaction', $dbSchema, '>', $sqlDumpFile], 
     \$in, \$out, \$err); 

    if($err) { 
     $logp->info($err); 
     # do other stuff? 
     # Eg. `unlink($sqlDumpFile);    
    } else { 
     `gzip $sqlDumpFile`; # note you will have renamed this file to "filename".gz 
    } 
} 
+1

나는 그가 단지 로그 파일에 가기를 원한다고 생각한다. – jordanm

+0

@jordanm OP는 모든 출력을 원했습니다. "mysqldump (및 화면에 출력되는 다른 모든 stmt)의 출력을 log4perl 로그 파일로 보내고 싶습니다." STDERR은 원하지만 STDOUT은 원하지 않는 것을 볼 수 있습니다. – chrsblck

+0

혼란에 사과드립니다. 나는 stderr/stdout/mysqldump 명령의 다른 모든 stds를 log4perl 로그 파일로 보내길 원한다. –