我有一个Perl脚本,它使用log4perl将所有内容记录到文件中。 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 ($@) {
$logp->error( 'error: ', $@ );
}
$logp->info("end backup script");
这是脚本输出 -
[root@localhost 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 :(得分:1)
如果您想同时执行这两项操作:请记录mysqldump
和gzip
,您可以执行以下操作:
修改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
}
}