0

我有一个 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 日志文件。

4

1 回答 1

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
    }
}
于 2013-04-24T22:25:53.687 回答