2013-04-24 80 views
0

我有一个Perl脚本,它使用log4perl将所有内容记录到文件中。 log4perl的配置存储在外部文件中。mysqldump输出到log4perl

该脚本使用qx运行mysqldump命令。 mysqldump命令的输出被打印到屏幕(我假定为STDERR),但不记录文件。

我想直接输出mysqldump(和任何其他打印到屏幕的stmt)到log4perl日志文件。

我不确定这是否涉及使用除qx以外的内容或更改log4perl配置。

注:我已经看到了一些在线的例子,但他们都使用log4perl easy-config。

这里是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 %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 

这里是perl脚本 -

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"); 

这里是脚本输出 -

[[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 

澄清 - 我说的输出,我的意思是mysqldump命令的stderr输出。我希望将写在屏幕上的mysqldump命令的所有文本输出发送到log4perl日志文件。

+0

你期望看到什么输出?你将所有输出从'mysqldump'管道到'gzip> somefile'。 – chrsblck 2013-04-24 21:59:21

+0

澄清,这就是我的解决方案。捕获所有输出并记录它。 – chrsblck 2013-04-25 04:53:36

回答

1

如果你想两者都做:登录的mysqldumpgzip你可以做这样的事情:

通过修改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 
} 

更新

如果你只想日志错误,那么你可以做这样的事情。

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

我认为他只想要stderr去日志文件。 – jordanm 2013-04-25 02:13:51

+0

@jordanm OP提到想要所有输出。 “我希望将输出pf mysqldump(以及任何其他打印到屏幕的stmt)指向log4perl日志文件。”我可以看到想要STDERR而不是STDOUT。 – chrsblck 2013-04-25 02:41:53

+0

为混淆道歉。我希望mysqldump命令中的stderr/stdout /任何其他stds都转到log4perl日志文件。 – 2013-04-25 04:17:46

相关问题