From: Darold Gilles Date: Mon, 7 Apr 2014 17:39:02 +0000 (+0200) Subject: Fix incomplete lines in split_logfile to rewind to the begining of the line. Thanks... X-Git-Tag: v5.1~28 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0e4fe2e1af706b4b2b9e8ec1c9becaf9765da23a;p=pgbadger Fix incomplete lines in split_logfile to rewind to the begining of the line. Thanks to brunomgalmeida for the patch. --- diff --git a/pgbadger b/pgbadger index 624e970..476810f 100755 --- a/pgbadger +++ b/pgbadger @@ -1584,6 +1584,7 @@ sub process_file $cursize += length($line); $current_offset += length($line); + chomp($line); $line =~ s/\r//; $nlines++; @@ -9984,10 +9985,26 @@ sub split_logfile $chunks[0] = $saved_last_line{current_pos}; $i = $saved_last_line{current_pos}; } + my ($lfile, $null) = &get_log_file($logf); # Get file handle to the file while ($i < $queue_size) { push(@chunks, int(($totalsize/$queue_size) * $i)); + my $pos = int(($totalsize/$queue_size) * $i); + my $safe_pos = $pos; + # Goto the position of that chunk and rewind to the begining of the line + # Do not rewind more than 1OK to prevent infinite loop. + my $line = ''; + my @matches = (); + do { + $lfile->seek($pos, 0); + $line = <$lfile>; + @matches = ($line =~ $compiled_prefix); + $pos-- if (@matches < 0); + } while ((@matches < 0) && ($pos > ($safe_pos - 10000))); + # Get EOL position + push(@chunks, $pos); $i++; } + $lfile->close(); push(@chunks, $totalsize); return @chunks;