Perl日志记录无法处理长系统调用



我有一个Perl脚本,它正在调用AWS命令行将文件上传到S3。它使用Log4Perl来记录有关上传的信息。当上传量很小,几秒钟后,日志记录就可以了——但当文件更大,需要几分钟时,就不会记录任何内容。文件上传得很好,但没有创建日志文件。

我就是这样做的:

#get start time
my @dt = localtime;
my $TransferStartDate = strftime("%Y-%m-%d", @dt);
my $TransferStartTime = strftime("%H:%M:%S", @dt);
my $aws_command = "/path/to/aws/bin/aws s3 mv $local_file s3://" . $s3_bucket;
my $aws_status = system( $aws_command);
#get stop time
@dt = localtime;
my $TransferEndDate = strftime("%Y-%m-%d", @dt);
my $TransferEndTime = strftime("%H:%M:%S", @dt);
my $log_conf = "
log4perl.rootLogger                 = $log_level, LOG1
log4perl.appender.LOG1              = Log::Log4perl::Appender::File
log4perl.appender.LOG1.filename     = /path/to/logs/aws_s3_log-$TransferEndDate.txt
log4perl.appender.LOG1.mode         = append
log4perl.appender.LOG1.layout       = Log::Log4perl::Layout::PatternLayout
log4perl.appender.LOG1.layout.ConversionPattern = %d %p %m %n
";
Log::Log4perl::init($log_conf);
my $logger = Log::Log4perl->get_logger();
$logger->info( "Transfer command = $aws_command" );
$logger->info( "Transfer start = $TransferStartDate $TransferStartTime" );
$logger->info( "Transfer end = $TransferEndDate $TransferEndTime" );
#check return code 
if ( $aws_status == 0 ) 
{
$logger->info( "Transfer completed successfully");
}
elsif ( $aws_status == 1 ) 
{
$errstring = "s3 transfer failed status = $aws_status";
$logger->error( $errstring );
}
elsif ( $aws_status == 2 ) 
{
$errstring = "Syntax error on AWS S3 command status = $aws_status";   
$logger->error( $errstring );
}
elsif ( $aws_status == 130 ) 
{
$errstring = "transfer interrupted by Ctrl-C or other SIGINT status = $aws_status";   
$logger->error( $errstring );
}
elsif ( $aws_status == 255 ) 
{
$errstring = "Command failed status = $aws_status";   
$logger->error( $errstring );
}
elsif ( $aws_status == 512 ) 
{
$errstring = "s3 command formatted incorrectly status = $aws_status";
$logger->error( $errstring );
}
else 
{
$errstring = "Error with AWS s3 command status = $aws_status"; 
$logger->error( $errstring );
}

你知道我做错了什么吗?使用系统进行调用应该会导致Perl脚本停止,直到上传完成,对吧?

由于您正在登录到文件,我会在脚本的最开始添加一个$|=1;

此外,我认为您应该在启动aws_command之前更早地实例化记录器,并使用``:启动它

$|=1;
my @dt = localtime;
my $TransferStartDate = strftime("%Y-%m-%d", @dt);
my $TransferStartTime = strftime("%H:%M:%S", @dt);
my $log_conf = "
log4perl.rootLogger                 = $log_level, LOG1
log4perl.appender.LOG1              = Log::Log4perl::Appender::File
log4perl.appender.LOG1.filename     = /path/to/logs/aws_s3_log-$TransferStartDate.txt
log4perl.appender.LOG1.mode         = append
log4perl.appender.LOG1.layout       = Log::Log4perl::Layout::PatternLayout
log4perl.appender.LOG1.layout.ConversionPattern = %d %p %m %n
";

Log::Log4perl::init($log_conf);
my $logger = Log::Log4perl->get_logger();
my $aws_command = "/path/to/aws/bin/aws s3 mv $local_file s3://" . $s3_bucket;
my $aws_output = `$aws_command`;
my $aws_status = $?;
#get stop time
@dt = localtime;
my $TransferEndDate = strftime("%Y-%m-%d", @dt);
my $TransferEndTime = strftime("%H:%M:%S", @dt);
$logger->info( "Transfer command = $aws_command" );
$logger->info( "Transfer result = $aws_result" );

不确定它是否能解决您的问题,但可能会帮助您缩小诊断范围。

最新更新